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

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()吗?

最佳答案

最近,我遇到了一个奇怪的问题,即从后台恢复时,它以类似的异常轰炸,而任务在到达后台时已在运行一半。我改用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);
}


这解决了我的问题。您可能要试一试...?

10-08 06:54