AsyncTask没有收到取消

时间:2014-02-21 16:02:53

标签: android android-asynctask illegalstateexception

我的AsyncTask面临一个小问题。 我以这种方式运行asynctask:

myTask = new myTask();

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    // same as onquerychange
                    return true;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    if (!s.isEmpty()) {
                        if (myTask.getStatus() == AsyncTask.Status.RUNNING ||
                                myTask.getStatus() == AsyncTask.Status.PENDING) {
                            myTask.cancel(true);
                        }
                        myTask.execute(context, s);
                    } else {
                        myTask.execute(context, "emptyquery");
                    }
                    return true;
                }
            });

一旦我输入第二个字母,我不断获取:java.lang.IllegalStateException:无法执行任务:任务已经执行(任务只能执行一次)

所以我认为它不会被取消。有什么建议?感谢

2 个答案:

答案 0 :(得分:2)

您不能多次执行相同的AsyncTask。您必须在每次执行它之前对其进行实例化,例如:

myTask = new myTask();
myTask.execute(context, s);

当然,您可以在开始时删除初始化。

要停止并重新启动,请使用:

myTaks.cancel(true);
myTask = new myTask();
myTask.execute(context, s);

即使您取消AsyncTask,也无法再次使用它。

答案 1 :(得分:2)

当你调用myTask.cancel();时,AsyncTask会尝试停止该线程。要强制执行此操作,您可以使用以下命令检查任务是否已取消:

if(isCancelled()){
   return null;
}

doInBackground内并自行封锁。否则,在调用onPostExecute之前已经检查过AsyncTask的状态。这样,如果你调用cancel(),你确定没有返回任何值。在这里查看文档:{​​{3}}

并且无论如何:AsyncTask只能执行一次。如果必须再次运行它,则必须实例化另一个AsyncTask。