2010-12-13 23 views
12

我有我使用一個處理程序如下:的Android,暫停和恢復處理回調

handler.postDelayed(Play, 1000); 

當我的應用程序的onPause()被調用之前做到這一點,我需要暫停它,告訴它不要執行「postDelayed」直到我恢復。

這是可能的,還是有其他方法?

我的問題是,當調用onPause()時,我會暫停音頻(SoundManager),但如果此後調用此handler.postDelayed,則音頻將不會暫停,並將繼續在後臺與我的應用程序一起播放。

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

但後來在1000ms後延遲開始播放音頻。

回答

13

你有沒有試着用:

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

GER

+1

是的,但如果我恢復這個,回調被刪除的聲音從未開始播放,所以那裏沒有什麼可以恢復的。我仍然希望它恢復這種聲音。 (或者如果它尚未啓動,則啓動它)。 – Hamid 2010-12-13 13:25:21

+3

您可以實現onResume方法並在那裏執行handler.postDelayed(Play,1000); – ggomeze 2010-12-13 14:05:44

+2

這是很久以前的事了,自從這個問題以來,我有了重要的Android體驗。我會接受這個答案,因爲這是正確的,因爲我應該在暫停時刪除回調。 – Hamid 2012-03-16 10:40:25

16

您需要繼承Handler和實現暫停/恢復方法如下(當時只是叫handler.pause()時要暫停的消息處理,並調用handler.resume()當你想重新啓動它):

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

工作,謝謝你。這應該是被接受的答案。 – 2016-06-16 12:53:38

+0

線程的'run'方法在哪裏? – Si8 2016-12-05 01:27:32

+1

沒有運行方法。處理程序不是一個單獨的線程(它在您的線程中運行)。 – CpnCrunch 2016-12-06 02:32:43