AsyncTask никогда не выполняется на PostExecute - PullRequest
3 голосов
/ 22 ноября 2011

Я пытаюсь выполнить следующую AsyncTask:

private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> {

        @Override
        protected Void doInBackground(List<mObject>... params) {
            mObject o;
            int i;
            int numChecked = 0;

            List<mObject> mObjects = params[0];
            while(true)
            {   
                if (isCancelled())
                {
                    Log.w("TAG", "task interrumped");
                    return null;
                }

                    for (i=0 ; i < mObjects.size() ; i++)
                    {
                        o = mObjects.get(i);
                        if (!o.isChecked())
                        {
                            o.calculateProgress();
                            if (o.isChecked())
                            {
                                numChecked++;
                            }
                        }
                    }
                publishProgress(numChecked);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }

            }
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void onProgressUpdate(Integer... param){
            int progressCompleted = param[0];

            ((ArrayAdapter<mObject>) EventListView.this.EventView.getAdapter()).notifyDataSetChanged();

            mMain.setProgressBarCompleted(progressCompleted);
        }

        /*This should execute*/
        @Override
        protected void onPostExecute(Void result) {
            Log.d("TAG","End onPostExecute");
         }

    }

Поэтому, когда я вызываю cancel(false) для этой задачи, onPostExecute должно быть выполнено, но это не так.

Есть ли проблема в коде или что-то еще? Я посмотрел на множество ответов в SO, и кажется, что наличие # 5 AsyncTask - это нормально, даже если вы используете только один (как в моем случае) в данный момент.

Ответы [ 3 ]

10 голосов
/ 22 ноября 2011

Здесь отсутствует один большой фрагмент, о котором вы должны узнать.

из документации для разработчиков (см. Полужирный текст ниже): http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)

Попытки отменить выполнениеэта задача.Эта попытка потерпит неудачу, если задача уже выполнена, отменена или не может быть отменена по какой-либо другой причине.Если успешно, и эта задача не была запущена при вызове отмены, эта задача никогда не должна выполняться.Если задача уже запущена, параметр mayInterruptIfRunning определяет, следует ли прерывать поток, выполняющий эту задачу, при попытке остановить задачу.

При вызове этого метода будет вызываться onCancelled (Object) в пользовательском интерфейсепоток после doInBackground (Object []) возвращает. Вызов этого метода гарантирует, что onPostExecute (Object) никогда не будет вызван. После вызова этого метода вы должны периодически проверять значение, возвращаемое isCancelled () из doInBackground (Object []), чтобы завершить задачу как можно раньше.

3 голосов
/ 22 ноября 2011

Android использует onCancelled (), когда задача отменяется, она не вызывает onPostExecute!

2 голосов
/ 22 ноября 2011

Я думаю, что вызов отмены на самом деле отменяет все от выполнения, включая onPostExecute. Вы должны использовать свою собственную локальную логическую переменную и сделать это:

private boolean shouldContinue = true;

public void customCancel() 
{
       shouldContinue = false;
}

тогда в вашем цикле сделайте это:

if (!shouldContinue)
{
    Log.w("TAG", "task interrumped");
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...