我有一个AsyncTask如下:
private class SearchTask extends AsyncTask<Object, Object, Object> {
@Override
protected void onPreExecute() {
super.onPreExecute();
System.out.println("Start");
}
@Override
protected Object doInBackground(Object... urls) {
SearchFunction();
return null;
}
@Override
protected void onPostExecute(Object result) {
System.out.println("End");
}
}
如下定时器:
private Handler handler = new Handler();
private Runnable updateTimer = new Runnable() {
public void run() {
System.out.println("===status===");
System.out.println(SearchTask.getStatus());
SearchTask.cancel(true);
handler.postDelayed(updateTimer, 3000);
}
};
并调用AsyncTask和计时器代码如下:
handler.postDelayed(updateTimer, 3000);
SearchTask SearchTask = new SearchTask();
SearchTask.execute();
doInBackground中的SearchFunction方法可能花费超过3秒,因此添加一个计时器
但是在updateTimer中首先调用并取消AsyncTask,doInBackground仍然在运行直到它完成,然后取消onPostExecute。
如何直接取消doInBackground?
答案 0 :(得分:1)
基本上你不能这样做。最好的事情是当你设置cancel(true)
意味着你将忽略onPostExecute()
上运行的代码(可能在那里放一个if
语句)。希望这会有所帮助。
答案 1 :(得分:1)
偶尔检查一次isCancelled()并尝试一下:
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}