gpt4 book ai didi

java - 自定义 Runnable 实现,用于检查每行代码之间的 Thread.currentThread().isInterrupted()

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:49 25 4
gpt4 key购买 nike

我正在尝试实现一个类,它可以管理传入的 Runnables 并取消任何 Runnables,无论它们在代码中的位置,保证。

举个例子,在 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() 的检查,并退出该方法,以避免以某种方式进一步调用。

最佳答案

考虑使用AsyncTask。取消 AsyncTask 并不能保证后台工作将停止,除非任务检查其自身状态。但取消确实保证 onProgressUpdateonPostExecute 不会被调用。如果 onProgressUpdate 不足以在步骤之间更新 UI,请将每个步骤放入其自己的任务中。

关于AsyncTask的一些技巧:

他们至少更改了几次默认线程池。如果您想更好地控制执行,请使用 executeOnExecutor 启动任务。 .

谨防保留对 Activity 的引用。一个糟糕的建议(由一本广受好评的书 IIRC 所推广)说,为任务提供一个对 Activity 的弱引用,并在访问 UI 之前对其进行检查。这是错误的,因为框架可能在调用 onDestroy 后保留对 Activity 的引用,并且当它清除其引用时,WeakReference 不会变为 null,直到 GC 注意到该 Activity 不可强访问为止。您应该在 Activity 中维护一组正在运行的任务,并在 Activity 暂停或销毁时取消它们。

要通过配置更改保持任务运行,请将它们托管在保留的 headless fragment 中。

关于java - 自定义 Runnable 实现,用于检查每行代码之间的 Thread.currentThread().isInterrupted(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com