Android:无法取消异步任务

时间:2014-07-03 10:31:43

标签: android android-asynctask androidhttpclient asynchttpclient

我有一个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等待异步任务完成,然后它返回到父活动。

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

有人可以告诉我如何取消此异步任务吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

如果你正在使用这个

asyncFetch.cancel(true);

然后,您需要签入用户设置取消doInBackGround()的{​​{1}}方法。 trueasyntask中定义了一种方法。您需要检查它。

isCancelled()

Android文档说明了if(isCancelled()) //break out of doInBackground and handle this case

  

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

您也可以查看文档here

答案 1 :(得分:0)

您需要像这样更新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
      }

}