【问题标题】:How to refresh Android UI from an event listener?如何从事件监听器刷新 Android UI?
【发布时间】:2014-02-22 02:19:02
【问题描述】:

我有一个数据包侦听器,可以检测数据包何时到达,并且在发生这种情况时我需要刷新ArrayAdapter。问题是如果我尝试访问adapter.notifyDataSetChanged() 方法,就会抛出异常:

Exception in packet listener: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

有什么想法吗?

【问题讨论】:

  • 你从哪里调用 adapter.notifyDataSetChanged() ?它必须来自另一个线程,而不是 UI 线程。

标签: android events android-arrayadapter notifydatasetchanged


【解决方案1】:

假设您在一个可以访问应用程序上下文的对象中:

如果你在Activity

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

如果你在Fragment

Activity act = getActivity();
if (act != null) {
    act.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });
}

存在其他选项,例如循环器/消息处理程序等,但这是迄今为止最简单的。

【讨论】:

  • 问题是我需要在事件发生后调用adapter.notifyDataSetChanged()来更新UI。出于这个原因,我需要知道何时发生事件来更新 ui,但是我无法调用侦听器内部的方法,因为抛出了异常......
  • @user3339544,您的适配器属于哪个类?假设您在片段或活动中,您可以通过执行上述操作来调用侦听器内部的方法。那你在其他班级听众吗?如果是这样,您将需要获取 UI 线程的处理程序。请使用一些代码更新帖子,显示您的听众的性质。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多