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

时间:2014-12-20 23:33:30

标签: android android-asynctask tesseract

我的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(),如果为true,则通过返回null跳过所有后续指令。但是,似乎因为第一个仍在运行,并且因为我将它重新实例化为同一任务的新实例,所以它们共享一个取消的标志,因此onCancelled()返回true,即使用户取消它,因此第一个仍在运行的实例不会跳过我希望它跳过的步骤。有意义吗?

我觉得在onPostExecute()中我可以查看类似

的内容
if (myOCRTask.getStatus() != AsyncTask.Status.RUNNING)

声音可能会起作用吗?

1 个答案:

答案 0 :(得分:3)

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

相反,您应该做的是修改库以偶尔检查是否已取消,如果是,则安全退出。