【问题标题】:How to force Asynctask to cancel without checking for isCancelled()如何在不检查 isCancelled() 的情况下强制 Asynctask 取消
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • afaik 取消 AsyncTask 只是设置一个标志,它不会杀死线程或以其他方式与之交互。
  • @rupps 通过取消的通话,是的。我说的是直接线程终止,这正是他想要的。
  • hmm 他想中断任务,唯一的方法是修改库并轮询已取消。直接终止asynctask线程?这甚至可能吗? (除了危险)
  • 很有趣,谢谢 Gabe。我有点担心这种性质的影响,但我知识渊博,无法真正知道会发生什么,所以感谢您回答我的部分问题=)我将用下一个问题编辑我的原始问题,因为这是我遇到的问题的一部分。
  • @rupps 可以直接终止 Java 中的线程,尽管该机制已被弃用并且文档说您永远不应该使用它(有充分的理由)。 AsyncTask 是 Thread 的一个瘦包装器。它没有直接的 API,但如果你能得到一个 Thread 句柄,你就可以做到。如果不出意外,您可能可以使用反射来达到目的。不过,它可能会搞砸整个 AsyncTask 子系统。
猜你喜欢
  • 2011-06-12
  • 2018-11-13
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2015-05-15
  • 2022-01-11
相关资源
最近更新 更多