2010-12-13 56 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