【问题标题】:Cannot execute AsyncTask after onPostExecute firedonPostExecute 触发后无法执行 AsyncTask
【发布时间】:2017-06-23 15:35:40
【问题描述】:

我有一个扩展 AsyncTask 的类。我使用接口从我班级的onPostExecute() 获取结果,它工作正常。问题是当我从执行的任务中获得结果时(女巫意味着 当前任务已完成 )我需要通过 该类的同一实例 执行另一个任务,但我收到此错误:

    java.lang.IllegalStateException: Cannot execute task: the task is already running

问题出在哪里,我应该如何解决?为什么上一个任务还活着?

【问题讨论】:

  • 新建 AsyncTask 对象并执行。
  • 最好在此处发布您的代码
  • @quicklearner 已解决,谢谢 ;)
  • 你为它做了什么?
  • @quicklearner 创建了新的类实例,正如答案所说:)

标签: android multithreading android-asynctask


【解决方案1】:

来自docs

启动HONEYCOMB,任务返回being executed on a single thread,避免并行导致的常见应用错误 执行。

所以一旦一个线程已经启动,你不能再次启动它,只需创建一个新的任务对象并应用执行

execute 内部调用executeOnExecutor

 public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
    }

来自executeOnExecutordocs

抛出:

java.lang.IllegalStateException 如果 getStatus() 返回 AsyncTask.Status.RUNNING 或 AsyncTask.Status.FINISHED。

【讨论】:

  • 创建了该对象的新实例,但结果相同
  • 你所说的 new instance of that object 是什么意思,你需要创建你的 AsyncTask 类的实例,提供关于你想要做什么以及你正在做什么的精确细节
  • 一件重要的事情,似乎您需要第一次通话的数据,所以当您的第一个任务完成并且您有数据可以使用时,您可能应该从onPostExecute 开始下一个任务
  • 有了新实例,没问题。但我需要相同的实例!我对其属性进行了很多更改,并且需要这些变量
  • 为什么你可以从onPostExecute 开始另一个异步任务并将这些值传递给execute 函数或将这些值传递给某个函数并从它们开始新任务,或者如果你的异步任务是一个单独的类然后创建接口回调
【解决方案2】:

您不能重复使用相同的AsyncTask 对象。新建一个:

CustomAsyncTask task = new CustomAsyncTask();
task.execute("");
...
// This will result in crash
// task.execute("");

task = new CustomAsyncTask();
// This is ok
task.execute("");

Here's 抛出异常的行。

【讨论】:

  • 如果我这样做会怎样:newtask = oldTask; newtask.execute();
  • 不起作用,然后oldTask 将有另一个名称,即newtask
  • 不,这行不通。创建一个新的AsyncTask 有什么问题?
  • 因为我需要那个对象的属性
猜你喜欢
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多