- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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/
我是一名优秀的程序员,十分优秀!