2014-10-25 4 views
0

Привет У меня есть вопрос об Android AsyncTask. У меня есть фрагмент внутри Activity. Этот фрагмент вызывает AsyncTask, где он делает что-то тяжелое и обновляет пользовательский интерфейс в onPostExecute(). Мой вопрос в том, что. Говорят, что пользователь открыл активность. Теперь фрагмент присоединен и вызывается функция doInBackground() AsyncTask. Затем пользователь внезапно нажимает кнопку «Назад», чтобы закрыть активность. Теперь, что происходит с исполнением в потоке AsyncTask? Линия также умирает, как только активность закрыта? Или у меня есть ручная проверка onPostExecute, добавлен ли этот фрагмент, используя isAdded() в начале onostExecute()? Спасибо!Android - Simple AsyncTask

EDIT

В моем фрагменте, я объявляю AsyncTask() неявно .. как это

  new AsyncTask<String, Void, Boolean>() { 
       @Override 
       protected Boolean doInBackground(String... params) { 
        return processPlays(plays); 
       } 

       @Override 
       protected void onPostExecute(Boolean result) { 
        if (!isAdded()) return; // IS THIS FINE? 
        // UPDATE UI 
       } 
      }.execute(); 

ответ

0

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

Аналогичным образом, фрагменты можно отделить и уничтожить в течение жизненного цикла приложения. Вы никогда не можете предположить, что фрагмент или активность по-прежнему активен, как только вернулся из doInBackground AsyncTask давал (в)

+0

Да ... вот почему я возвращаюсь (!); в начале onPostExecute(); См. Прилагаемый код. Это безопасно? – user2062024

+0

Да. Это безопасно. Примечание. «isAdded» не обязательно означает, что фрагмент не существует или не будет добавлен позже, поэтому рекомендуется сохранять состояние независимо и обновлять интерфейс, если это необходимо. – DeeV

0

В этом случае AsyncTask нить будет держать работает до конца, и если ее не остановить, может врезаться в onPostExecute(). В большинстве случаев вы хотите отменить AsyncTask на onStop(), onFinish() или даже onPause()Activity (в зависимости от вашего приложения).

Вы можете отменить задачу с помощью метода cancel(boolean mayInterruptIfRunning). От Android reference:

Задача может быть отменена в любое время путем вызова cancel (boolean). Вызов этого метода приведет к последующим вызовам isCancelled() в return true. После вызова этого метода, onCancelled (Object), вместо из onPostExecute (Object) будет вызываться после того, как doInBackground (Object []) возвращается. Для того, чтобы задача отменена настолько быстро, насколько это возможно, вы должны всегда проверять возвращаемое значение isCancelled() периодически из doInBackground (Object []), если это возможно (внутри цикла, например.)

+0

Дело в том, что моя AsyncTask объявлена ​​неявно. как новый AsyncTask <..> {...} .execute(); И я запускаю if (! IsAdded()) return; в начале onPostExecute(). Это безопасно? – user2062024

+0

Вы по-прежнему можете сохранить ссылку для AsyncTask в поле класса. 'asyncTask = new AsyncTask <..> {...}; asyncTask.execute(); 'Тогда можно вызвать' asyncTask.cancel() 'в любом месте.Что вы сделали, это безопасно, может быть, просто не то, что рекомендуется. – MadEqua