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 } 
Intereting Posts
Как я могу найти использование данных для каждого приложения на Android? Разработка двух приложений для Android и связь между двумя Как вы получаете цвет выделения в Android? Создано виртуальное устройство Android, не показывающее Как обращаться с кнопками «сохранить» и «отменить» и обратно Android – Как работает мгновенная загрузка Google+? Теперь, когда SSLSocketFactory устарел на Android, какой был бы лучший способ справиться с проверкой подлинности сертификата клиента? GetLastVisiblePosition возвращает -1 Подходит ли Glide каждый запрос на изображение? Нагрузка при повторном просмотре очень медленная при прокрутке Как я могу отлаживать javascript на Android? Текст TextView исчезает при повороте устройства Android: попытка понять андроид: layout_weight Добавить ребенка в MenuItem внутри группы в NavigationView Невозможно прочитать имя пакета из AndroidManifest.xml (Android Xamarin) Получить значение строки ресурса вместо int