日常笔记
最近做一个即时通讯的功能,当想即时刷新聊天UI界面时,程序闪退,并弹出了这个错误提示信息**Observer android.widget.AbsListView$AdapterDataSetObserver@2d8b713 was not registered.**闪退的原因在于在非UI线程里对ListView进行刷新。(如果想详细了解程序崩溃的过程。个人推荐:可以阅读这位博主的这篇文章:https://blog.csdn.net/zhanglianyu00/article/details/51191295)
解决方法:使用多线程的方法,并通过Handler来处理线程与Activity之间的通信问题即可。
首先在ChatActivity中创建一个Handler对象,当收到信息后就更新ListView。代码如下:
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg){
super.handleMessage(msg);
switch (msg.what){
case 0:
ChatData = getChat_data();
BaseAdapter adapter = new NewAdapter(ChatActivity.this);
//notifyDataSetChanged()是告知UI数据发生变化,并刷新adapter,但这个方法不能够在非UI线程中调用。否则会crash。
adapter.notifyDataSetChanged();
list_chat.setAdapter(adapter);
break;
default:
break;
}
}
};
然后就是在自己代码里的消息响应事件里使用多线程,并在多线程中调用Handler对象。
@Subscribe
public void onEvent(MessageEvent event){
new Thread(){
public void run(){
handler.sendEmptyMessage(0);
}
}.start();
}
这样就可以当接收到好友的信息后会及时的刷新界面。
最后看一下效果图吧。