Counter Alternative?

M

MBPower

Fortgeschrittenes Mitglied
11
Ich lasse mir XX Zufallszahlen zwischen 1 und 5 erstellen. Mit diese Zufallszahlen möchte ich dann Bild eines ImageButtons austauschen und einen Sound abspielen. Nach XXX Millisekunden möchte ich den ImageButton wieder zurücktauschen. Leider gibt es hin und wieder Probleme mit dem Counter. Wenn das App über Home geschlossen wird und wieder neu gestartet, dann kommt der Counter nicht mehr klar und es gibt Probleme. Teilweise läuft der auf einmal doppelt so schnell usw.
Thread.sleep ist dafür auch keine gute Lösung. Ich möchte doch nur einem Aufruf immer wieder eine kurze Pause gönnen, aber ohne das alles blockiert wird.
Gibt es eine Alternative zu dem counter, oder hat jemand eine gute Idee für mich?

Hier kurz sehr vereinfacht was ich machen möchte.
Code:
player = MediaPlayer.create(getBaseContext(), R.raw.test);
counter = new MyCount(5000, 500);
counter1 = new MyCount1(250, 250);
counter.start();
Code:
public class MyCount extends CountDownTimer{

    public MyCount(long millisInFuture, long countDownInterval) {
    super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        
    }

    @Override
    public void onTick(long millisUntilFinished) {
        player.start();
        btn[0].setBackgroundResource(R.drawable.btn_test2);
        counter1.start();
    }
}
Code:
public class MyCount1 extends CountDownTimer{

    public MyCount1(long millisInFuture, long countDownInterval) {
    super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        btn[0].setBackgroundResource(R.drawable.btn_test1);
    }

    @Override
    public void onTick(long millisUntilFinished) {

    }
}
 
Zuletzt bearbeitet:
Evtl. brauchst du keinen CountdownTimer, sondern einfach

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
imageButton.setBackgroundResource(oldPic);
}}, 5000);
 
  • Danke
Reaktionen: MBPower
Danke Dir.
Das hilft mir schon mal weiter.

Kannst Du mir auch noch sagen, wie ich den handler in eine Schleife einbauen kann? Den Delay von 1000ms bemerkt der bei dem folgenden Code nicht.

Code:
for ( int i = 0; i < 10; i++ ) {
                
    Handler handler = new Handler();
    handler.postDelayed(new Runnable(){
    public void run(){

        toast(""+ count);
        btn[0].setBackgroundResource(R.drawable.btn_test1);
        player0.start();
        count++;
    
    }}, 1000); 
}
 
MBPower schrieb:
Danke Dir.
Das hilft mir schon mal weiter.

Kannst Du mir auch noch sagen, wie ich den handler in eine Schleife einbauen kann? Den Delay von 1000ms bemerkt der bei dem folgenden Code nicht.

Code:
for ( int i = 0; i < 10; i++ ) {
                
    Handler handler = new Handler();
    handler.postDelayed(new Runnable(){
    public void run(){

        toast(""+ count);
        btn[0].setBackgroundResource(R.drawable.btn_test1);
        player0.start();
        count++;
    
    }}, 1000); 
}

Sry ich weiß nicht genau was du machen willst, und der Sinn der Schleife erschließt sich mir überhaupt nicht..
Willst du wirklich dass nach 1s zehnmal das gleiche hintereinander ausgeführt wird?
Und pack bitte zumindest den Handler ausserhalb der Schleife.. wenns geht auch das Runnable...
Optimalerweise ruft man stets nur handler.postDelayed(myRunnable, 1000); auf.
 
Das ist nur ein Beispielcode, denn ich möchte nicht den gesamten Code posten. ;-)

Ich möchte z.B. 10x hintereinander im Abstand von z.B. 500ms einen Sound abspielen und den Hintergrund eines Image Buttons ändern. Das ganze am besten ohne einen counter.
 
MBPower schrieb:
Danke Dir.
Das hilft mir schon mal weiter.

Kannst Du mir auch noch sagen, wie ich den handler in eine Schleife einbauen kann? Den Delay von 1000ms bemerkt der bei dem folgenden Code nicht.

Code:
for ( int i = 0; i < 10; i++ ) {
                
    Handler handler = new Handler();
    handler.postDelayed(new Runnable(){
    public void run(){

        toast(""+ count);
        btn[0].setBackgroundResource(R.drawable.btn_test1);
        player0.start();
        count++;
    
    }}, 1000); 
}

1. Nach der Schleife starten nach einer Sekunde 10 Player fast gleichzeitig.
2. Würden 10 Player fast gleichzeitig starten, wenn es nicht die ganze Zeit der gleiche Player wäre. Also stottert der Player nur. (oder was auch immer passiert wenn man den gleichen Player 10 mal nacheinander startet)
3. Ist es sinnlos den Background jedesmal auf das gleiche zu setzen.
 
Wie auch oben schon geschrieben ist das nur ein Auszug aus dem gesamten Code.

Natürlich macht es kein Sinn den Background immer wieder gleich zu setzten. In dem gesamten Code setzten ich bei i=0 den Background bei Button[0] bei i=1 bei Button[0] usw.

Code:
Handler handler = new Handler();

for ( int i = 0; i < 10; i++ ) {
                
    handler.postDelayed(new Runnable(){
    public void run(){

        toast(""+ count);
        btn[count].setBackgroundResource(R.drawable.btn_test1);
        player0.start();
        count++;
    
    }}, 1000); 
}

Auch dieser Code ist nicht vollständig.

Das hier was nicht stimmt ist mir auch klar, denn der Code läuft ja nicht, aber was kann man machen, damit das ganze funktioniert und nach jedem Durchlauf eine Sekunde Pause gemacht wird. Wenn es möglich ist, dann möchte ich keinen Counter verwenden.
 
Code:
handler.postDelayed(new Runnable(){
    public void run(){

        toast(""+ count);
        btn[count].setBackgroundResource(R.drawable.btn_test1);
        player0.start();
        count++;
        handler.postDelayed(this, 1000);
    }}, 1000);
 
Kann es erst Morgen testen, aber warum sollte er den Code 10x durchlaufen, ohne die for-schleife? Für mich ist ja wichtig, das der Code 10x durchlaufen wird und das immer mit 1 Sekunde Pause dazwischen.
 
Naja, wenn du nen Zähler in die anonyme Klasse packst kannst du zählen bis wohin du willst:

Code:
handler.postDelayed(new Runnable(){
    int counter = 0;
    public void run(){

        //whatever you wanna do.

        if(counter < 10) {
            handler.postDelayed(this, 1000);
            counter ++;
        }
        
    }}, 1000);
Jetzt wird das alles genau 10 mal ausgeführt und zwar im Abstand von 1000 ms.

Oder du gehst hin und haust das mit in das postDelayed:
Code:
Handler handler = new Handler();

for ( int i = 0; i < 10; i++ ) {
                
    handler.postDelayed(new Runnable(){
    public void run(){
         // Whatever you wanna do
    
    }}, i*1000); 
}
So wird das erste sofort ausgeführt und die anderen im Abstand von 1000ms.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: MBPower
Danke Dir.
Werde ich heute Abend ausprobieren.
 

Ähnliche Themen

E
Antworten
4
Aufrufe
1.223
enrem
E
H
Antworten
2
Aufrufe
1.111
heikoj10.1
H
KyleFlores
Antworten
1
Aufrufe
835
cptechnik
cptechnik
Zurück
Oben Unten