我使用一个处理程序,它通过 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/