【发布时间】:2018-09-16 21:16:12
【问题描述】:
我正在尝试实现一个可以管理传入的 Runnable 并取消任何 Runnable 的类,无论它们在代码中的什么位置,保证。
例如,在 Android 中,我希望能够执行以下操作。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
manager.submit(new Runnable() {
@Override
public void run() {
someLongRunningTaskThatCallsTheUi();
}
});
}
@Override
public void onPause() {
manager.cancel(); // cancels all Runnables to avoid issues with calling the UI
}
如果 Future 的 cancel() 方法实际上并不能保证 Runnable 代码的取消并且 ExecutorService 的 shutdownNow() 有同样的问题,我该如何解决这个问题?
据我所知,我需要在要调用的每一段 UI 代码之前添加对 Thread.currentThread().isInterrupted() 的检查,并退出该方法以避免以某种方式进一步调用。
【问题讨论】:
-
您可能可以通过某种直接的字节码操作或代码编织来做到这一点。撇开这些黑暗艺术不谈,您所要求的根本不是线程如何工作。
-
当我遇到这个问题时,我就有这样的印象。那么有没有更好的方法来解决这个问题?我想通过单击按钮在后台启动长时间运行的操作,但也允许用户在需要时退出,取消操作。
-
这些
Runnables是您自己编写的,还是您应用的第三方插件? -
我正在写它们。我只是不想将
if (isInterrupted) return;放在可运行的多个位置。这感觉像是一种非常脆弱的代码编写方式。 -
AsyncTask不起作用有什么原因吗?取消它不会停止不检查状态的后台工作,但它确实保证不会在 UI 线程中发生进一步的回调。对于具有多个步骤的流程,完成一项任务可以开始下一项任务。
标签: java android multithreading runnable executorservice