0

我有一个数据包侦听器,用于检测数据包何时到达,并在发生这种情况时需要刷新ArrayAdapter。问题是,如果我尝试访问adapter.notifyDataSetChanged()方法,则会引发异常:如何从事件侦听器刷新Android用户界面?

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

任何想法?

+0

你从哪里调用adapter.notifyDataSetChanged()?它必须来自另一个线程,如在UI线程中。 – darnmason

回答

0

假设你是在一个对象可以访问应用程序上下文:

如果你是一个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(); 
     } 
    }); 
} 

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

+0

问题是我需要在事件发生后调用adapter.notifyDataSetChanged()来更新UI。出于这个原因,我需要知道什么时候发生更新ui的事件,但是我不能调用监听器中的方法,因为引发了异常...... – user3339544

+0

@ user3339544,您的适配器在哪个类中?您可以通过执行上述操作来调用侦听器中的方法,前提是您处于片段或活动状态。那么你是否还在其他课堂听众?如果是这样,您将需要获取UI线程的处理程序。请用一些代码来更新帖子,以显示您的听众的性质。 – Jared