Android,暂停和恢复处理程序回调

Ham*_*mid 12 android callback handler

我有一个处理程序,我使用如下:

handler.postDelayed(Play, 1000);
Run Code Online (Sandbox Code Playgroud)

当我的应用程序onPause()在完成之前被调用时,我需要暂停它并告诉它不要执行"postDelayed"直到我恢复.

这是可能的,还是有另一种方式?

我的问题是,当调用onPause()时,我暂停音频(SoundManager),但如果此后调用此handler.postDelayed,音频将不会暂停,并将继续在后台播放我的应用程序.

@Override
public void onPause()
{
  Soundmanager.autoPause()
}
Run Code Online (Sandbox Code Playgroud)

但是1000ms后的postDelayed再次启动音频播放.

Cpn*_*nch 19

您需要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
               // ...
        }
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 工作,谢谢你.这应该是公认的答案. (3认同)
  • 没有运行方法。处理程序不是单独的线程(它在您的线程中运行)。 (2认同)
  • @CpnCrunch 这也适用于“post(runnable)”吗? (2认同)

ggo*_*eze 14

你尝试过:

@Override
public void onPause()
{
  handler.removeCallbacks(Play);
  Soundmanager.autoPause()
}
Run Code Online (Sandbox Code Playgroud)

GER

  • 你可以实现onResume方法并在那里执行handler.postDelayed(Play,1000); (4认同)
  • 这是很久以前的事了,自从这个问题以来我有很多Android经验.我会接受这个答案,因为它是正确的,我应该在暂停时删除回调. (3认同)
  • 是的,但是如果我继续执行此操作,则由于从未开始播放回调而删除了该声音,因此没有任何恢复内容。我仍然希望它恢复声音。(或者,如果尚未启动,请启动它)。 (2认同)

Sha*_*sal 5

修改CpcCrunch给出的答案。那里的handleMessage对我不起作用,所以用dispatchMessage代替它。注意:以下代码是用 Kotlin 编写的:

class CustomHandler: Handler() {

    var s = Stack<Message>()
    var is_paused = false

    @Synchronized
    fun pause() {
        is_paused = true
    }

    @Synchronized
    fun resume() {
        is_paused = false
        while (!s.empty()) {
            sendMessageAtFrontOfQueue(s.pop())
        }
    }

    override fun dispatchMessage(msg: Message?) {
        if (is_paused) {
            s.push(Message.obtain(msg))
            return
        } else {
            super.dispatchMessage(msg)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)