AsyncTask иногда не запускается, несмотря на то, что состояние RUNNING?

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

Он работает нормально, но я заметил, что если приложение останавливается дважды до того, как AsyncTask переходит к методу doInBackground, то при повторном запуске Activity AsyncTask не работает должным образом, а только переходит к методу onPreExecute().

Вот мой код:

Сам AsyncTask:


private class SelectRingtoneTask extends AsyncTask<String, Void, Void> {

          // can use UI thread here   
          protected void onPreExecute() {
              Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished);
          }

          // automatically done on worker thread (separate from UI thread)
          protected Void doInBackground(final String... args) {
              Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!");
             getRingTone();
             return null;
          }

          // can use UI thread here
          protected void onPostExecute(final Void unused) {
           selectRingtoneFinished = true;
           Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished);
          }
       }

Где я вызываю AsyncTask при запуске:


if(srtt == null){
srtt = new SelectRingtoneTask();
Log.d("cda", "RingTone - " + srtt.getStatus());
}
srtt.execute();

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

У кого-нибудь есть идеи, почему это происходит?


person Donal Rafferty    schedule 10.09.2010    source источник


Ответы (2)


Вам нужно cancel выполнить AsyncTask, когда ваша Activity будет уничтожена, и в методах AsyncTask проверить наличие флага isCancelled, прежде чем пытаться работать с полученными результатами.

Я настоятельно рекомендую прочитать исходный код полок, чтобы узнать, как сохранять задачи при изменении конфигурации и как правильно их отменить при уничтожении активности.

person Pentium10    schedule 10.09.2010
comment
Спасибо Pentium10, так что я должен вызвать selectrintongtask.cancel(true) в моем методе Activity onDestroy()? И в каждом из методов Asynctask реализовать проверку isCancelled, прежде чем что-либо делать в методе? В исходном коде шевлеса есть какой-то конкретный файл, который лучше всего подчеркивает это? Спасибо еще раз - person Donal Rafferty; 10.09.2010
comment
Просто добавлю, что я реализовал отмену задачи в своем методе onDestroy, и это вызвало какое-то странное поведение, а не когда я заканчиваю свою деятельность в первый раз, а во второй раз, когда я пытаюсь ее запустить, я получаю только пустой экран - person Donal Rafferty; 10.09.2010
comment
Проверьте AddBookActivity.java и UserTask(mAddTask) и SearchTask в этом файле. code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/ - person Pentium10; 10.09.2010
comment
Еще раз спасибо, я не понимаю цели UserTask, это другая реализация AsyncTask? Почему бы им просто не расширить AsyncTask? - person Donal Rafferty; 10.09.2010
comment
Я не знаю, но не вмешивайся в это. Просто посмотрите, как они обрабатывают события цикла активности для переменной mAddTask. - person Pentium10; 10.09.2010
comment
После реализации точно так же, как AddBookActivity на полках, у меня все еще есть та же проблема :( может быть, это ошибка в 1.6? - person Donal Rafferty; 10.09.2010
comment
Хорошо, я думаю, вам следует опубликовать еще один вопрос с полным исходным кодом активности и описать проблему, с которой вы столкнулись. Не забудьте упомянуть, что вы реализуете отмену. - person Pentium10; 10.09.2010
comment
Pentium10 Вы голосуете за все свои комментарии с другого аккаунта? ;) - person Maxim; 21.06.2011

    if(srtt == null){    <--- Not needed
        srtt = new SelectRingtoneTask();
        Log.d("cda", "RingTone - " + srtt.getStatus());
    }
    srtt.execute();

Я не уверен, что вы имеете в виду под словом «закрыть», но у меня была похожая проблема с нитью. На мой взгляд, проблема здесь в том, что вы запускаете ту же активную задачу второй раз, когда вам это не разрешено. чтобы устранить проблему при закрытии активности, отмените поток и убедитесь, что для srtt установлено значение null. Надеюсь это поможет

person Marcin Waśniowski    schedule 27.05.2011