1

我有一个搜索任务,当第二次单击该按钮时,它会取消当前正在运行的任务并重新创建它。

if (_searchAsyncTask != null) {
    // cancel if already running
    _searchAsyncTask.cancel(true);
}
_searchAsyncTask = new SearchAsyncTask(this);
_searchAsyncTask.execute(data);

这在上述代码的最后一行失败,就好像我再次调用了原始异步任务一样。

java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)

我错过了什么吗?我需要等到原始实例 isCancelled() 吗?

4

1 回答 1

2

最近我遇到了一个奇怪的问题,当它从后台恢复时出现类似的异常,并且当它进入后台时任务已经运行到一半。我改用 AsyncTask.executeOnExecutor 来解决这个问题(一些代码可能是多余的):

if (_searchAsyncTask == null) {
    _searchAsyncTask = new SearchAsyncTask();
}

if (mThreadExecutor != null && !mThreadExecutor.isShutdown()) {
    mThreadExecutor.shutdownNow();
}

if (mThreadExecutor == null || mThreadExecutor.isShutdown()) {
    mThreadExecutor = Executors.newSingleThreadExecutor();
}

if (_searchAsyncTask.getStatus() != Status.RUNNING) {
    _searchAsyncTask.executeOnExecutor(mThreadExecutor);
}

这解决了我的问题。你可能想试一试...?

于 2012-09-11T23:51:49.563 回答