如何在Android上取消AsyncTask

时间:2013-08-07 07:31:10

标签: android android-asynctask

我有一个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?

2 个答案:

答案 0 :(得分:1)

基本上你不能这样做。最好的事情是当你设置cancel(true)意味着你将忽略onPostExecute()上运行的代码(可能在那里放一个if语句)。希望这会有所帮助。

答案 1 :(得分:1)

偶尔检查一次isCancelled()并尝试一下:

protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
}