1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Counter Alternative?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MBPower, 07.09.2010.

  1. MBPower, 07.09.2010 #1
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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: 07.09.2010
  2. Fr4gg0r, 07.09.2010 #2
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Evtl. brauchst du keinen CountdownTimer, sondern einfach

    Handler handler = new Handler();
    handler.postDelayed(new Runnable(){
    public void run(){
    imageButton.setBackgroundResource(oldPic);
    }}, 5000);
     
    MBPower bedankt sich.
  3. MBPower, 07.09.2010 #3
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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); 
    }
    
     
  4. Fr4gg0r, 07.09.2010 #4
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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.
     
  5. MBPower, 07.09.2010 #5
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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.
     
  6. the_alien, 07.09.2010 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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.
     
  7. MBPower, 08.09.2010 #7
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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.
     
  8. the_alien, 08.09.2010 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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); 
    
     
  9. MBPower, 08.09.2010 #9
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    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.
     
  10. the_alien, 08.09.2010 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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: 08.09.2010
    MBPower bedankt sich.
  11. MBPower, 09.09.2010 #11
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    Danke Dir.
    Werde ich heute Abend ausprobieren.
     

Diese Seite empfehlen