2010-12-13 8 views
12

ich einen Handler, die ich verwende, wie folgt:Android, Anhalten und Fortsetzen Handler Rückrufe

handler.postDelayed(Play, 1000); 

wenn meine Anwendung onPause() aufgerufen wird, bevor dies geschehen ist, ich muss es anhalten und sagen, dass es nicht um die "postDelayed" durchzuführen, bis ich fortfahre.

ist dies möglich, oder gibt es einen alternativen Weg?

Mein Problem ist, dass wenn onPause() aufgerufen wird ich die Audio (SoundManager) pausieren, aber wenn diese handler.postDelayed danach aufgerufen wird, wird die Audio nicht angehalten und wird weiterhin mit meiner Anwendung im Hintergrund spielen .

@Override 
public void onPause() 
{ 
    Soundmanager.autoPause() 
} 

aber dann die postDelayed nach 1000ms startet das Audio wieder zu spielen.

Antwort

13

Haben Sie versucht, mit:

@Override 
public void onPause() 
{ 
    handler.removeCallbacks(Play); 
    Soundmanager.autoPause() 
} 

Ger

+1

Ja, aber wenn ich das fortsetze, wird der Sound, für den der Callback entfernt wurde, nie wieder so abgespielt ist nichts zu wiederholen. Ich möchte immer noch, dass dieser Ton wieder aufgenommen wird. (Oder starten Sie es, wenn es noch nicht begonnen hat). – Hamid

+3

Sie können die onResume-Methode implementieren und dort die handler.postDelayed ausführen (Play, 1000); – ggomeze

+2

Dies war vor langer Zeit, und ich habe signifikante Android-Erfahrung seit dieser Frage. Ich werde diese Antwort akzeptieren, weil es korrekt ist, dass ich den Rückruf bei der Pause entfernen sollte. – Hamid

16

Sie müssen Handler Unterklasse und Pause/Resume-Methoden wie folgt zu implementieren (dann handler.pause() nur aufrufen, wenn Sie Umgang pausieren Nachricht möchten, und rufen handler.resume() wenn du es neu starten willst):

class MyHandler extends Handler { 
    Stack<Message> s = new Stack<Message>(); 
    boolean is_paused = false; 

    public synchronized void pause() { 
     is_paused = true; 
    } 

    public synchronized void resume() { 
     is_paused = false; 
     while (!s.empty()) { 
      sendMessageAtFrontOfQueue(s.pop()); 
     } 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     if (is_paused) { 
      s.push(Message.obtain(msg)); 
      return; 
     }else{ 
       super.handleMessage(msg); 
       // otherwise handle message as normal 
       // ... 
     } 
    } 
    //... 
} 
+2

Arbeiten, danke Mann. Dies sollte die akzeptierte Antwort sein. –

+0

Wo ist die 'run' Methode für den Thread? – Si8

+1

Es gibt keine Laufmethode. Ein Handler ist kein separater Thread (er wird in Ihrem Thread ausgeführt). – CpnCrunch

Verwandte Themen