【问题标题】:Is any alternative to AsyncTask or how to restart AsyncTask?是否可以替代 AsyncTask 或如何重新启动 AsyncTask?
【发布时间】:2018-02-22 21:15:19
【问题描述】:

基于Android开发者文档网页AsyncTaskThread,可以向AsyncTask的线程发送cancel()请求。尽管我已经发送了取消请求并且它成功了,但线程仍在运行。有什么停止执行的想法吗?

    button.setOnClickListener {
      Log.i(TAG, asyncTaskObj.status)                       // RUNNING
      if (asyncTaskObj.status == AsyncTask.Status.RUNNING) {
         asyncTaskObj.cancel(true)
         Log.i(TAG, asyncTaskObj.isCancelled)               // True
      }
      Log.i(TAG, asyncTaskObj.status)                       // RUNNING
    }

另外,有没有比AsyncTask 更简单的替代方法,让我们重新开始执行线程? (显然无法重启AsyncTaskQ&A-2

还有一件事,我已经阅读了以下问题Q&A-1Q&A-2。但是,答案对我不起作用。例如,没有isRunning 变量。

附:我的代码在 Kotlin 中。请用 Java 或 Kotlin 分享您的想法。

【问题讨论】:

  • "有停止执行的想法吗?" -- 你正在停止执行。但是,您假设cancel() 同步发生,getStatus() 将立即返回不同的值。 getStatus()cancel() 返回时肯定还没有更新,基于the source code

标签: android android-asynctask


【解决方案1】:

不可能像那样安全地立即从外部取消线程。你不知道它可能正在运行什么操作,线程可能持有什么锁,等等。因此,取消实际上并没有立即停止线程。它设置一个标志,AsyncTask 的工作是检查标志并通过从 doInBackground 返回来结束自身。不要假设任何取消的线程或任务会立即停止运行。如果您的代码需要,您需要修复您的代码。

至于重新启动——从头开始?使用相同的参数创建 AsyncTask 的新实例。从你离开的地方?您可以通过多种方式进行操作,但这需要大量工作。而 AsyncTask 不适合这样做,因为它的线程是所有任务之间的共享资源,您需要为此使用实际的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多