gpt4 book ai didi

android - 如何在不检查 isCancelled() 的情况下强制取消 Asynctask

转载 作者:行者123 更新时间:2023-11-29 17:44:11 25 4
gpt4 key购买 nike

我的 doInBackground() 方法中有一个特定命令,该命令持续时间约为 20 秒。理想情况下,我可以在用户取消任务后立即中断它,但由于程序在完成之前不会通过该命令,所以无论如何它最终都会花费大约 20 秒。在这里:

    String recognizedText = baseApi.getUTF8Text();

它是 tess-two OCR 库的一部分,它是使用 OCR 算法实际扫描图像中的文本的命令。我有,在它之后,

if (myOCRTask.isCancelled()) {
Log.i(TAG, "isCancelled() true.");
return null;
}

这按预期工作,但我仍然希望能够在 OCR 运行期间以某种方式中断任务。有什么方法可以用 Asynctask 做到这一点,或者我是否需要实现一些其他机制?

提前致谢。

编辑:

我应该提到一个额外的问题,因为我无法在预期的时间范围内取消任务。

如果用户取消任务,他们有机会使用新图像重新启动它,在这种情况下我调用:

    myOCRTask = new OCRTask();
myOCRTask.execute();

再次。现在,在原始任务(myOCRTask 的原始实例)中,它最终会检查 isCancelled(),如果为真,则通过返回 null 跳过所有后续指令。但是,似乎因为第一个仍在运行,并且因为我将其重新实例化为同一任务的新实例,所以它们共享一个已取消的标志,因此即使用户 onCancelled() 返回 true取消了它,因此第一个仍在运行的实例没有跳过我希望它跳过的步骤。有道理吗?

我突然想到在 onPostExecute() 中我可以检查类似的东西

if (myOCRTask.getStatus() != AsyncTask.Status.RUNNING)

听起来好像可行?

最佳答案

你永远不应该这样做。这不是一件安全的事情。您不知道该库正在使用什么资源,并且通过取消其上的线程将导致它不释放这些资源。最好的情况是你会发生大量内存泄漏。在最坏的情况下,您会将库置于任何进一步使用都会使您的应用程序崩溃的状态。 Java 弃用停止线程功能是有原因的 - 这不是您应该做的事情。

相反,您应该做的是修改库,以便偶尔与您核实它是否已取消,如果已取消,则安全退出。

关于android - 如何在不检查 isCancelled() 的情况下强制取消 Asynctask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585353/

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