android - 在 Handler 中执行所有预定的(postDelayed)runnables

标签 android handler runnable android-handler

我使用一个处理程序,它通过 postDelayed(r, DELAY_TIME) 发布一些 Runnable,但我需要在发布之前执行所有 Runnables通过 postDelayed 新建。

有什么好的想法可以尽可能简单地实现这一目标吗?

编辑:

我想要的基本上是这样的:

Runnable r = new Runnable() {
    // Do some fancy action
};

if (mHandler.runnablesScheduled) {
    mHandler.flushAllScheduledRunnables();
}
mHandler.postDelayed(r, DELAY);

最佳答案

在一个数组中,跟踪将要调用的runnables,然后,如果你想调用它们,取消postDelayed并直接调用runnables,调用run()<来触发它们 来自 runnable 的方法。示例代码:

// Declaring the Handler and the Array that is going to track Runnables going to be tracked.
final mHandler = new Handler();  
final List<Runnable> callStack = new ArrayList<Runnable>();

// Method to remove a runnable from the track Array.
public void removePostDelayed(Runnable run) {
    callStack.remove(run);
}

// Method that we use in exchange of mHandler.postDelayed()
public void myPostDelayed(Runnable run, int delay) {
    // I remove callbacks because I don't know if can be called 2 times.
    mHandler.removeCallbacks(run);

    // We remove the Runnable from the tracking Array just in case we are going to add a Runnable that has not been called yet.
    removePostDelayed(run);

    // We add the runnable to the tracking Array and then use postDelayed()
    callStack.add(run);
    mHandler.postDelayed(run, delay);
}

// This is the Runnable. IMPORTANT: Remember to remove the Runnable from the tracking Array when the Runnable has been called.
Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        // Do some fancy stuff and remove from the tracking Array.
        removePostDelayed(this);
    }
}

// Method to execute all Runnables
public void callAllStack() {
    // We create a copy of the tracking Array because if you modify the Array while you are iterating through it, will return an Exception.
    List<Runnable> callStackCopy = new ArrayList<Runnable>();

    // here we copy the array and remove all callbacks, so they are not called by the Handler.
    for (Runnable runnable : callStack) {
        callStackCopy.add(runnable);
        mHandler.removeCallbacks(runnable);
    }

    // Then we call all the Runnables from the second Array
    for (Runnable runnable : callStackCopy) {
        runnable.run();
    }

    // And clear the tracking Array because the Handler has no more Runnables to call (This is redundant because supposedly each run() call removes himself from the tracking Array, but well... just in case we forgot something).
    callStack.clear();
}

// Example of postDelaying a Runnable while tracking if has been fired.
myPostDelayed(myRunnable, 1000)

// Example of firing all Runnables.
callAllStack();

非常简单,我已经对其进行了评论,以便您更好地理解它,但如果您不理解某些内容,请对其进行评论。您可以修改它以支持对同一个 Runnable 的多次调用,或者只是创建您自己的 Handler 类扩展,称为 TrackingHandler 并实现了这些功能或其他东西。

我现在是即时编写代码,所以可能有很多错别字,不知道。

关于android - 在 Handler 中执行所有预定的(postDelayed)runnables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244273/

相关文章:

android - 如何为 Theme.Holo.Light.DialogWhenLarge 获取深色操作栏?

java - Activity 将服务与应用程序上下文绑定(bind) -> 配置更改后按回时服务泄漏

java - 即使线程不共享数据,你也应该使用 runnable 吗?

android - Thread.sleep() 与 handler.post Delay() 每 30 秒执行一次网络调用

android - onCreate() 中的新处理程序

java - 为什么在实现 Runnable 时使用 Thread.currentThread().isInterrupted() 而不是 Thread.interrupted()?

java - Runnable 中的 AsyncHttpClient

android - react native : Could not find support-vector-drawable. aar

android - java中的Dumpsys权限拒绝

android - 深入理解 Android Fingerprint API authenticate()