Android:notifyDataSetChanged()在方向更改后不更新listview

Bar*_*ara 6 multithreading android listview orientation android-arrayadapter

我有一个半复杂的问题,希望有人能够帮助我.

在单击事件上,我创建一个线程并基于方法启动长时间运行的操作.在长时间运行的任务完成后,它会回调到另一种方法,它不后的处理程序:

@Override
public void contentSearchModelChanged(Model_ContentSearch csm, ArrayList<Class_Reminder> newRemindersList) {
    remindersList = newRemindersList;
    mHandler.post(mUpdateDisplayRunnable);
}
Run Code Online (Sandbox Code Playgroud)

哪个叫Runnable:

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

最后,这是我的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我正常地这样做时,这很好用.不过,如果我更改方向的长时间运行的操作运行时,这是行不通的.它确实使回调正确,并且remindersList确实包含项目.但是当它达到这条线时:

r_adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

什么都没发生.奇怪的是,如果我做的另一项提交并使其再次运行全过程(不改变方向),它实际上更新视图两次,一次为前下一个提交又一次.所以一旦与第一结果视图更新提交,然后再次与第二提交第二次以后的结果.因此,适配器DID获取数据,它只是不刷新视图.

我知道这与方向改变有关,但我不能为我的生活找出原因.有人可以帮忙吗?或者,任何人都可以建议一种处理方向更改线程的替代方法吗?

巴拉

Jer*_*nes 6

问题是当你改变方向时,一个新的活动从头开始(onCreate).您长时间运行的进程可以处理旧的(不再可见)活动.您正在更新旧活动,但由于它不在屏幕上,您看不到它.

这不是一个容易解决的问题.那里有一个图书馆可以帮助你.它被称为DroidFu.这篇博文(比我更准确)描述了你所看到的根本原因以及DroidFu库如何对抗它:http://brainflush.wordpress.com/2009/11/16/introducing-droid- 福换Android的betteractivity-betterservice-和betterasynctask /

编辑:(添加用于跟踪活动活动的代码)

在你的应用程序类中添加:

private Activity _activeActivity;
public void setActiveActivity(Activity activity) {
    _activeActivity = activity;
}
public Activity getActiveActivity() {
    return _activeActivity;
}
Run Code Online (Sandbox Code Playgroud)

在您的活动中,添加以下内容:

@Override
public void onResume() {
    super.onResume();
    ((MyApplicationClassName)getApplication()).setActiveActivity(this);
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过调用MyApplicationClassName.getActiveActivity()来获取活动活动;

这不是DroidFu的做法.DroidFu在onCreate中设置了活动活动,但我觉得它不是很强大.