Problem bei verzögerung

  • Antworten:10
Basti
  • Forum-Beiträge: 6

18.04.2014, 18:13:30 via Website

Hallo liebe Community.

Ich bin neu hier und bin mir deshalb nicht sicher ob dies das richtige Forum ist. Wenn dieser Ort falsch ist bitte einfach nur anmerken. Nun zum Problem: Ich möchte eine App programmieren die zufällig einen Befehl ausgibt und dies 10mal wiederholt und zwischen den einzelnen Befehlen eine 10 Sekunden Pause ist. Jedoch ergibt die Verzögerung wie ich sie eingebaut habe keinen Sinn und wenn ich die Kommandos starte stürzt die App ab, da anscheinend zu viele Ressourcen benötigt werden.

Hier mein Quellcode: package de.Basti.obediencetrainer;

import android.media.MediaPlayer; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View;

public class Obedience extends Activity {

public MediaPlayer mp;
public MediaPlayer mp1;
public MediaPlayer mp2;
public MediaPlayer mp3;
public MediaPlayer mp4;
public MediaPlayer mp5;
public MediaPlayer mp6;
public int XD;

public void soundstarten(View view){

    XD = 0;
    MediaPlayer mp4 = MediaPlayer.create(getApplication(),R.raw.rechts);
    MediaPlayer mp = MediaPlayer.create(getApplication(),R.raw.halt);
    MediaPlayer mp1 = MediaPlayer.create(getApplication(),R.raw.kehrtwendung);
    MediaPlayer mp2 = MediaPlayer.create(getApplication(),R.raw.laufschritt);
    MediaPlayer mp6 = MediaPlayer.create(getApplication(),R.raw.normalschritt);
    MediaPlayer mp5 = MediaPlayer.create(getApplication(),R.raw.vorwaerts);
    MediaPlayer mp3 = MediaPlayer.create(getApplication(),R.raw.links);
    mp5.start();
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e){};

    for (int i=0;i<11;i++){
        XD = (int)(Math.random()*6)+1;
        switch(XD){
        case 1:

            mp.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};

            mp.stop();

            mp5.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp5.stop();
            i=i+1;
            break;
        case 2:

            mp1.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp1.stop();
            break;
        case 3:

            mp2.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp2.stop();

            mp6.start();
            try {

                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp6.stop();
            i=i+1;
            break;

        case 4:

            mp3.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp3.stop();
            break;
        case 5:

            mp4.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp4.stop();
            break;
        case 6:

            mp5.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e){};
            mp5.stop();
            break;

        }



    }
    mp.start();

}

}

Könntet ihr mir sagen wo das Problem liegt bzw. dieses vielleicht sogar lösen?

MFG Basti

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.04.2014, 19:51:58 via Website

Hallo Basti, nach deinem Code zu urteilen willst du verschiedene Sound in einer Random Reihenfolge abspielen oder sehe ich das falsch? Warum stürzt die App ab? Was steht im LogCat? Beschreibe das Problem genauer, bei was wir dir helfen sollen. Btw. Vlt. solltest du mal nen bisschen deinen Code besser gestalten. Catch-Blöcke lässt man nicht einfach leer. Wenigsten ein e.printStackTrace oder noch besser im Log anzeigen.

Was soll die Math#random? damit bekommst du doch eine random zahl, nach der du weisst nicht wie groß diee Zahl ist. Es muss dann nicht zwingend ein case auslösen.Somit wird kein Sound abgespielt. Erkläre dein Vorhaben genauer, dann kann man dir besser helfen. PS: Den Thread#Sleep teil kannst du auch durch nen Handler#postDelayed ersetzen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Basti
  • Forum-Beiträge: 6

19.04.2014, 15:03:06 via Website

Also die App funktioniert im Großen und ganzen jedoch kann ich während er die Sounds abspielt( in einer Random-Reihenfolge) zum Beispiel nicht den anderen Knopf drücken, es frisst also zu viel Ressourcen und dieses Problem möchte ich lösen. Danke dass du mich darauf hingewiesen hast, dass die Zufallszahl zu groß werden kann, da hab ich mich verrechnet :D. Kannst du mir vielleicht ein Beispiel zu dem Handler#postDelayed geben, wie der/die/das aussieht? Und kann mir wer erklären, weshalb ich eine Verzögerung von 200 Sekunden angeben muss um die Schleife um 10 Sekunden zu verzögern?

LG Basti

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.04.2014, 15:12:51 via Website

Handlerbeispiel: http://stackoverflow.com/questions/10845172/android-running-a-method-periodically-using-postdelayed-call

Am besten du machst das dynamisch, damit du nicht so viele Ressourcen gleichzeitig brauchst. Ich würde Vorschlagen du hast eine Liste aller Ressourcen Sounds. Je nach Zufallszahl initialisiert du das Media Player Objekt anders. Wenn du einen Handler benutzt, dann braucht du dein Thread#Sleep nicht mehr, dann braucht das Problem dich nicht zu Stören. Wenn das mit den Ressourcen dann immer noch nicht passt, ist die nächste Möglichkeit deine App auf Sound Pool umstellen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Basti
  • Forum-Beiträge: 6

26.04.2014, 15:57:44 via Website

gelesen ja. Verstanden nein. Einbauen schon 3mal nicht :O.

Wenn du mir das vielleicht erklären könntest wäre ich dir sehr dankbar.

P.S : sry für die späte Antwort

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.04.2014, 20:04:14 via Website

Also du hast eine Runnable Methode, die durch das Post#delayed um die Anzahl der Millisekunden später gesendet wird, bzw ausgeführt wird. Also dann machst du eine Post delayed auf dein MediaPlayer Objekt, um dies einige Sekunden später abspielen zu lassen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Basti
  • Forum-Beiträge: 6

27.04.2014, 14:13:42 via Website

kannst du vielleicht den Grundaufbau mal posten?

Weil so kann ich damit nicht viel anfangen ;)

LG Basti

Antworten
impjor
  • Forum-Beiträge: 1.793

27.04.2014, 15:02:45 via App

So ungefähr könnte das aussehen:

postDelayed(new Runnable() {
     //Befehle
     postDelayed(this, 10 000 );
    }, 10 000);

Dann wird alle 10s "//Befehle" ausgeführt

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Basti
  • Forum-Beiträge: 6

28.04.2014, 16:08:21 via Website

ok danke ich werde das so mal ausprobieren.

Einfach meine switch-Methode anstatt des Befehle reinsetzen oder wie?

Und muss ich des postDelayed(this, 10 000) vor jedes break setzen?

LG Basti

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.04.2014, 16:24:29 via Website

Nicht statt der Switch Methode sondern das kommt in jedes case element ein.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Basti
  • Forum-Beiträge: 6

29.04.2014, 17:46:07 via Website

und wo dann genau?

Also wie würde ein case Element mit dem post Delayed aussehen?

Antworten