Остановите метод внутри doInBackground doAsyncTask - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть 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 ]

2 голосов
/ 20 сентября 2011

Из всего, что я прочитал, кажется, что метод cancel () не является надежным способом остановить AsyncTask.Прерывание отправляется в фоновый поток, но это эффективно только для прерывистых задач.По общему мнению, чтобы убедиться, что AsynTask остановлен, вы должны постоянно проверять isCancelled () в методе doInBackground вашего AsyncTask.

1 голос
/ 20 сентября 2011

Обычно я звоню cancel(true) в AsyncTask и проверяю Thread.interrupted() в doInBackground. Вы можете проверить 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...