我的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
:无法执行任务:任务已经执行(任务只能执行一次)
所以我认为它不会被取消。有什么建议?感谢
答案 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。