我有这个AsyncTask:
private class GetMyFlights extends AsyncTask<String, Void, Integer> {
private ProgressDialog dialog;
public GetMyFlights(ListActivity activity) {}
@Override
protected Integer doInBackground(String... params) {
return getData();
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
//...
}
}
当我换到另一个活动时,我想停止它。所以我设定了这个:
@Override
protected void onPause() {
if(mGetMyFlights != null){
mGetMyFlights.cancel(true);
Log.d(TAG, "MyFlights onPause, cancel task");
}
super.onPause();
}
但是当我更改活动时,getData中的代码仍然有效。我怎么能确定停止?
答案 0 :(得分:2)
从我读过的所有内容来看,似乎cancel()方法不是停止AsyncTask的可靠方法。中断被发送到后台线程,但这仅对可中断的任务有效。普遍的共识是,为了确保停止AsynTask,你应该在AsyncTask的doInBackground方法中不断检查isCancelled()。
答案 1 :(得分:1)
我通常会在cancel(true)
个实例上致电AsyncTask
并查看doInBackground
中的Thread.interrupted()
。您可以检查isCancelled()
,但如果实际工作是在某个独立于您的AsyncTask
并且不知道它的其他类中完成的,那么这不起作用。例如(直接从我自己的getData()
方法复制,在我的Data
类中,独立于任何活动,异步任务等):
while ((line = reader.readLine()) != null) {
if (Thread.interrupted()) throw new InterruptedException();
content.append(line);
}
只需确保处理InterruptedException
中的doInBackground()
,例如:
@Override
protected Integer doInBackground(String... params) {
try {
return getData();
}
catch (InterruptedException e) {
Log.d("MyApp", "Girl, Interrupted");
return -1;
}
}
另外值得注意的是,如果任务被取消,则onPostExecute()
不。而是调用onCancelled()
。