在doAsyncTask的doInBackground中停止方法

时间:2011-09-20 10:04:04

标签: android android-asynctask

我有这个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中的代码仍然有效。我怎么能确定停止?

2 个答案:

答案 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()