Android AsyncTasks Как проверить Если активность все еще запущена

Я использовал AsyncTasks с моим приложением, чтобы лениво загрузить и обновить интерфейс.

Пока мои AsyncTasks обновляют пользовательский интерфейс:

 protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); gender.setText(values[0]); } 

Моя проблема заключается в том, как проверить, доступна ли активность, которую предоставляет гендерный TextView ?

Если нет, я получу ошибку, и мое приложение отключится.

Вы можете отменить свою асинтезную активность в режиме onDestroy

 @Override protected void onDestroy() { asynctask.cancel(true); super.onDestroy(); } 

И при выполнении изменений вы проверяете, была ли ваша асинтеза отменена (активность уничтожена) или нет

 protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); if(!isCancelled()) { gender.setText(values[0]); } } 

У меня была аналогичная проблема – по сути, я получал NPE в async-задаче после того, как пользователь уничтожил фрагмент. После изучения проблемы с переполнением стека я принял следующее решение:

 volatile boolean running; public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); running=true; ... } public void onDestroy() { super.onDestroy(); running=false; ... } 

Затем я периодически проверяю «if running» в моем асинхронном коде. Я испытал это, и теперь я не могу «сломать» свою деятельность. Это прекрасно работает и имеет то преимущество, что оно проще, чем некоторые из решений, которые я видел на SO.

Пытаться

 if (!isFinishing()) { gender.setText(values[0]); } 

Я буду настаивать на том, что если вы не работаете, почему бы вам не отменить AsyncTask? Это было бы лучшим и выполнимым решением. Если приложение запущено, скажите, что вы переходите от одного действия к другому, тогда он не даст ошибку AFAIK.

Но я бы настаивал на том, чтобы отменить AsyncTask, тогда вы не работаете, вы можете проверить, работает ли AsyncTask или нет,

 if(task != null && task.equals(AsyncTask.Status.RUNNING)) task.cancel(true); 

Хотя я никогда не сталкивался с этим сценарием; Я постараюсь ответить на ваш вопрос.

В вашем случае вам нужно будет проверить Context переданный в AsyncTask .

Вы можете выполнить проверку

 if(null!=mContext) //Activity still exist!! { gender.setText(values[0]); } else //Activity is destroyed { //Take appropriate action!! } 

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

не должны

 if (gender) { gender.setText(values[0]); } 

быть достаточным?

Как говорится в этой части одного обучения разработчиков Android , сохраните WeakReference в элементе пользовательского интерфейса, который необходимо обновить после выполнения задачи, и проверьте, не является ли ссылка null до ее использования. Это помогает не только проверять, работает ли пользовательский интерфейс, но также не предотвращает сбор элементов пользовательского интерфейса.

Проверьте, работает ли работа или нет.

  if (!isFinishing()) { // Do whatever you want to do }