AsyncTask иногда не запускается, несмотря на то, что состояние выполняется. - PullRequest
0 голосов
/ 10 сентября 2010

В моем приложении я использую 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();

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

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

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

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

0 голосов
/ 27 мая 2011
    if(srtt == null){    <--- Not needed
        srtt = new SelectRingtoneTask();
        Log.d("cda", "RingTone - " + srtt.getStatus());
    }
    srtt.execute();

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

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