Android: notifyDataSetChanged () не обновляющий listview после изменения ориентации

У меня есть полусложная проблема и надеющийся, что кто-то здесь сможет помочь мне.

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

@Override
public void contentSearchModelChanged(Model_ContentSearch csm, ArrayList newRemindersList) {
    remindersList = newRemindersList;
    mHandler.post(mUpdateDisplayRunnable);
}

Который называет Выполнимое:

// post this to the Handler when the background thread completes
private final Runnable mUpdateDisplayRunnable = new Runnable() {
  public void run() {
    updateDisplay();
  }
};

Наконец, вот то, что мой updateDisplay () делает метод:

private void updateDisplay() {
    if (csModel.getState() != Model_ContentSearch.State.RUNNING) {
        if(remindersList != null && remindersList.size() > 0){
                r_adapter = new ReminderAdapater(Activity_ContentSearch.this, remindersList, thisListView);
                thisListView.setAdapter(r_adapter);
                r_adapter.notifyDataSetChanged();
        }
    }
}

Это работает красиво, когда я обычно делаю это. Однако, если я изменяю ориентацию, в то время как продолжительная операция работает, она не работает. Это действительно делает обратный вызов правильно, и remindersList действительно имеет объекты в нем. Но когда это добирается до этой строки:

r_adapter.notifyDataSetChanged();

Ничего не происходит. Нечетная вещь, если я делаю другой отправляет и имеет ее, выполняет целый процесс снова (не изменяя ориентацию), она на самом деле обновляет представление дважды, после того как для предыдущего отправляют и снова для следующего. Таким образом, обновления представления однажды с результатами первого отправляют, с другой стороны с результатами второго отправляют секунду спустя. Так adapater DID получают данные, он просто не обновляет представление.

Я знаю, что это имеет некоторое отношение к изменению ориентации, но я не могу ни за что в жизни выяснить почему. Кто-либо может помочь? Или, кто-либо может предложить альтернативный метод обработки потоков с изменениями ориентации?

Bara

6
задан Bara 21 June 2010 в 02:33
поделиться

1 ответ

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

Эту проблему нелегко решить. Существует библиотека, которая может вам помочь. Она называется DroidFu. Вот статья в блоге, которая (гораздо точнее, чем я) описывает первопричину того, что вы видите, и как библиотека DroidFu борется с этим: http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/

Edit: (Добавление кода для отслеживания активной активности)

В класс вашего приложения добавьте следующее:

private Activity _activeActivity;
public void setActiveActivity(Activity activity) {
    _activeActivity = activity;
}
public Activity getActiveActivity() {
    return _activeActivity;
}

В Activities добавьте следующее:

@Override
public void onResume() {
    super.onResume();
    ((MyApplicationClassName)getApplication()).setActiveActivity(this);
}

Теперь вы можете получить активную активность, вызвав MyApplicationClassName.getActiveActivity();

DroidFu делает это не так. DroidFu устанавливает активную активность в onCreate, но мне кажется, что это не очень надежно.

6
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: