【问题标题】:Android: Can not cancel an Async TaskAndroid:无法取消异步任务
【发布时间】:2014-08-24 10:27:13
【问题描述】:

我有一个Activity A,它有一个按钮。点击按钮,它会打开另一个Activity B,它显示从服务器(http)获取的数据。我使用的API 版本是15。

Activity B 打开后,在onCreate() 方法中,我将调用以下代码行。

        asyncFetch = new AsyncFetch();
        asyncFetch.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Async 任务执行http 通信以从服务器获取数据。

    @Override
    protected Object doInBackground(Object... params) {
        ...
        defaultHttpClient = new DefaultHttpClient();
        httpPost = new HttpPost(theURL);
        ...
        HttpResponse response = defaultHttpClient.execute(httpPost);
        ...
        return response...;
    }

获取数据后,会填充 UI。

onBackPressed()home 按钮,我正在调用以下代码来取消Async 任务。

            asyncFetch.cancel(true);

点击后退按钮或主页按钮时,Async 任务不会被取消,UI 会等待异步任务完成,然后返回父 Activity。

不使用execute() 的原因是因为我有几个Async 任务正在运行,我不希望这个任务等待其他Async 任务完成。

谁能告诉我如何取消这个异步任务?任何帮助表示赞赏。

【问题讨论】:

  • AsyncTasks,是我看到越来越少使用的东西。他们在 Activity 生命周期中存在问题。我会建议 Volley(非常好)或使用 IntentService,因为这些与生命周期无关。
  • 要添加到@SergeyBenner的评论,具体看第二个答案

标签: android android-asynctask androidhttpclient asynchttpclient


【解决方案1】:

如果你正在使用这个

asyncFetch.cancel(true);

然后您需要签入 doInBackGround() 方法,用户将取消设置为 trueasyntask , isCancelled() 中定义了一个方法。你需要检查一下。

if(isCancelled())
//break out of doInBackground and handle this case

Android 文档中提到了 isCancelled()

如果此任务在正常完成之前被取消,则返回 true。 如果您在任务上调用 cancel(boolean),则返回的值 应定期检查此方法 doInBackground(Object[]) 尽快结束任务。

您也可以查看文档here

【讨论】:

    【解决方案2】:

    您需要像这样更新您的 doInBackgraopund() 方法:

     @Override
        protected Object doInBackground(Object... params) {
    
           if (isCancelled()) {   // Always check for satus of your AsnycTask sataus. if it cancel break from loop.
    
              break;  // As long as your AsyncTask has cancel it will stop processing
    
           }
           else {
             // do your work here
          }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多