Android AsyncTasks Как проверить Если активность все еще запущена
Я использовал AsyncTasks
с моим приложением, чтобы лениво загрузить и обновить интерфейс.
Теперь my AsyncTasks
просто обновляет пользовательский интерфейс:
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
gender.setText(values[0]);
}
Моя проблема заключается в том, как проверить, доступна ли работа, которую предоставляет гендер TextView
?
Если нет, я получу ошибку, и мое приложение отключится.
Ответы
Ответ 1
Вы можете отменить свою асинтезу в действии onDestroy
@Override
protected void onDestroy() {
asynctask.cancel(true);
super.onDestroy();
}
а при выполнении изменений вы проверяете, была ли ваша асинтеза отменена (активность уничтожена) или нет
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if(!isCancelled()) {
gender.setText(values[0]);
}
}
Ответ 2
У меня была аналогичная проблема - по сути, я получал 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.
Ответ 3
Try
if (!isFinishing()) {
gender.setText(values[0]);
}
Ответ 4
Хотя я никогда не сталкивался с этим сценарием; Я постараюсь ответить на ваш вопрос.
В вашем случае вам нужно будет проверить Context
на AsyncTask
.
Вы можете выполнить проверку
if(null!=mContext) //Activity still exist!!
{
gender.setText(values[0]);
}
else //Activity is destroyed
{
//Take appropriate action!!
}
Преимущество будет заключаться в том, что если действие будет уничтожено к моменту достижения этой инструкции, ваш Context
автоматически станет null
, и вы сможете справиться с этим сценарием.
Ответ 5
Я буду настаивать на том, что если вы не работаете, почему бы вам не отменить AsyncTask?
Это было бы лучшим и выполнимым решением. Если приложение запущено, скажите, что вы переходите от одного действия к другому, тогда он не даст ошибку AFAIK.
Но я бы настаивал на том, чтобы отменить AsyncTask, тогда вы не работаете, вы можете проверить, работает ли AsyncTask или нет,
if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);
Ответ 6
Как эта часть одного обучения на Android-разработчиках предлагает сохранить WeakReference
в элементе пользовательского интерфейса, необходимо обновить после выполнения задачи и проверить, если ссылка null
перед ее использованием. Это помогает не только проверять, работает ли пользовательский интерфейс, но также не мешает отображению элементов пользовательского интерфейса.
Ответ 7
Проверьте, работает ли работа или нет
if (!isFinishing()) {
// Do whatever you want to do
}
Ответ 8
Не стоит
if (gender) {
gender.setText(values[0]);
}
достаточно?