用一个新的线程更新listView的内容,出现如下异常
08-07 22:13:13.336: ERROR/AndroidRuntime(10753): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
一个android程序默认只有一个process,一个process可以有多个Thread,在这些Thread中一个Thread叫做UI Thread,负责UI界面的显示、更新和控件交互。而其他的线程无法直接操作控件和使用控件相关的api,那么如果想在一个新的Thread中的更新控件,该如何操作呢,莫及@_*,在Android程序中我们可以使用Handler来操作,Handler用来处理和操作一个消息队列中的消息,所以我们可以通过向这个消息队列中发送消息来更新UI
1、handler定义
class EHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SnsConstant.LOAD_MORE_STATUS_WHAT:
setListAdapter();
break;
}
}
};
其中switch部分为处理消息部分,setListAdapter为对ui进行操作
2、对象声明
private EHandler handler= new EHandler();
3、发送消息
handler.sendEmptyMessage(SnsConstant.LOAD_MORE_STATUS_WHAT);
从中可以看出,所以我们在非ui线程中发送消息,然后在handler中处理消息,ok,搞定~
在android开发中我们需要充分利用线程及消息队列来处理需要长时间响应的操作,防止ui假死
参考:
http://jinguo.iteye.com/blog/660073
http://developer.android.com/guide/topics/testing/activity_testing.html#UITestTroubleshooting