我遇到了一个半复杂的问题,希望这里有人能够为我提供帮助。

在单击事件中,我创建一个线程并基于this方法启动长时间运行的操作。长时间运行的任务完成后,它将对另一个方法进行回调,该方法将向处理程序发布:

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

哪个调用了Runnable:
// 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();
        }
    }
}

当我正常执行此操作时,此方法效果很好。但是,如果我在长时间运行的操作正在运行时更改方向,则它将不起作用。它确实使回调正确,并且hintersList中确实包含项。但是当到达这一行时:
r_adapter.notifyDataSetChanged();

没发生什么事。奇怪的是,如果我再进行一次提交并再次运行整个过程(不改变方向),则它实际上将 View 更新了两次,一次是针对前一个提交,另一次是针对下一个提交。因此, View 使用第一个提交的结果更新一次,然后在第二个提交的第二个结果之后再次更新。因此,adapater DID获取数据,只是没有刷新 View 。

我知道这与方向变化有关,但是我无法一生找出原因。有人可以帮忙吗?或者,有人可以建议一种替代方法来处理方向发生变化的线程吗?

巴拉

最佳答案

问题在于,当您更改方向时,会从头开始创建新 Activity (onCreate)。您长时间运行的流程可以处理旧的(不再可见) Activity 。您正在正确更新旧 Activity ,但是由于它不再显示在屏幕上,因此您看不到它。

这不是一个容易解决的问题。虽然那里有一个图书馆可能会为您提供帮助。它称为DroidFu。这是一篇博客文章(比我准确得多)描述了您所看到的内容的根本原因以及DroidFu库如何解决该问题:http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/

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

在您的应用程序类中添加以下内容:

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

在您的 Activity 中,添加以下内容:
@Override
public void onResume() {
    super.onResume();
    ((MyApplicationClassName)getApplication()).setActiveActivity(this);
}

现在,您可以通过调用MyApplicationClassName.getActiveActivity();获得 Activity Activity 。

这不是DroidFu的工作方式。 DroidFu在onCreate中设置了 Activity Activity ,但我认为这不是很可靠。

关于Android:方向更改后,notifyDataSetChanged()不更新listview,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3081778/

10-12 04:00
查看更多