【发布时间】:2014-12-20 23:33:30
【问题描述】:
我的 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)
听起来可能有用吗?
【问题讨论】:
-
我猜你从来没有看过
AsyncTask的文档。 See this. -
如果 OCR 任务被阻塞,除了获取它的源代码并使用例如监听器来修改它以询问它是否被取消之外,别无他法。
-
@XaverKapeller AsyncTask.cancel() 只会将取消标志设置为 true,稍后您必须使用 isCanceled 检查。他正在寻找直接终止线程的方法——这是一个非常糟糕的主意。
-
Gabe 说的是:不幸的是,它并没有像我最初预期的那样强制中断它,它只是将取消标志设置为 true。
标签: android android-asynctask tesseract