【问题标题】:How to cancel AsyncTask on Android如何在 Android 上取消 AsyncTask
【发布时间】:2013-08-07 07:31:09
【问题描述】:

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

【问题讨论】:

  • 你的意思是说你需要在 3 秒后取消异步任务?
  • 更改 SearchTask 的对象名称...我很惊讶您的编辑器允许具有相同大小写的对象使用相同的类名称..

标签: android android-asynctask


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多