Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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]);
}

достаточно?