6

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

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

@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();
        }
    }
}

当我正常执行此操作时,它的效果很好。但是,如果我在长时间运行的操作运行时更改方向,它就不起作用。它确实正确地进行了回调,并且提醒列表中确实有项目。但是当它到达这条线时:

r_adapter.notifyDataSetChanged();

没发生什么事。奇怪的是,如果我再次提交并让它再次运行整个过程(不改变方向),它实际上会更新两次视图,一次用于上一次提交,一次用于下一次。因此,视图会使用第一次提交的结果更新一次,然后再使用第二次提交的结果更新一次。所以适配器 DID 获取了数据,它只是没有刷新视图。

我知道这与方向变化有关,但我一生都无法弄清楚原因。任何人都可以帮忙吗?或者,任何人都可以提出一种处理具有方向变化的线程的替代方法吗?

巴拉

4

2 回答 2

6

问题是当你改变方向时,一个新的活动会从头开始(onCreate)。您长时间运行的进程拥有旧(不再可见)活动的句柄。您正在正确更新旧活动,但由于它不再出现在屏幕上,因此您看不到它。

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

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

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

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

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

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

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

这不是 DroidFu 的做法。DroidFu 在 onCreate 中设置活动活动,但我觉得这不是很健壮。

于 2010-06-21T05:43:00.840 回答
1

我有一个类似的问题,有一个耗时的线程 sendEmptyMessage 到一个处理程序,该处理程序又在 ListAdapter 上调用 notifyDataSetChanged。在我改变方向之前它工作得很好。

我通过在 UI 线程中声明第二个处理程序并将第一个处理程序 sendEmptyMessage 发送到该处理程序来解决它,该处理程序又在 ListAdapter 上调用 notifyDataSetChanged。并将 ListAdapter 声明为静态。

我是新手,所以我不知道这是否是一个丑陋的解决方案,但它对我有用......

根据 Jere.Jones 的描述,我假设它的工作原理是:长时间运行的进程 sendEmptyMessage 从旧 Activity 到句柄,而后者又将EmptyMessage 发送到新 Activity 中的句柄。

于 2011-03-06T18:00:05.720 回答