我有一个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
任务完整。
有人可以告诉我如何取消此异步任务吗?任何帮助表示赞赏。
答案 0 :(得分:1)
如果你正在使用这个
asyncFetch.cancel(true);
然后,您需要签入用户设置取消doInBackGround()
的{{1}}方法。 true
,asyntask
中定义了一种方法。您需要检查它。
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
}
}