1

我有一个ActivityA 有一个按钮。在点击按钮时,它会打开另一个ActivityB,显示从服务器 (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任务完成。

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

4

2 回答 2

1

如果你正在使用这个

asyncFetch.cancel(true);

然后,您需要检查doInBackGround()用户将取消设置为的方法true。中定义了一个方法asyntaskisCancelled()您需要检查它。

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

Android 文档说关于isCancelled().

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

您也可以在此处查看文档。

于 2014-07-03T10:40:04.693 回答
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
      }

}
于 2014-07-03T10:39:55.033 回答