1
会出现:CalledFromWrongThreadExc
非UI线程发送消息到UI线程分为两个步骤
一、发送消息到UI线程的消息队列
通过使用Handler的
1
构造一个Message对象,这个对象存储了是否成功获取图片的标识what和bitmap对象,然后通过message.sendToTarget()方法把这条message放到消息队列中去。
二、处理发送到UI线程的消息
在ui线程中,我们覆盖了handler的
1
这个方法是处理分发给ui线程的消息,判断msg.what的值可以知道mThread是否成功获取图片,如果图片成功获取,那么可以通过msg.obj获取到这个对象。
最后,我们通过
1
设置ImageView的bitmap对象,完成UI的更新。
补充:
事实上,我们还可以调用
View的post方法来更新ui
1
2
3
4
5
6
7
这种方法会把Runnable对象发送到消息队列,ui线程接收到消息后会执行这个runnable对象。
从例子中我们可以看到handler既有发送消息和处理消息的作用,会误以为handler实现了消息循环和消息分发,其实Android为了让我们的代码看起来更加简洁,与UI线程的交互只需要使用在UI线程创建的handler对象就可以了。如需深入学习,了解消息循环机制的具体实现,请关注《Android异步处理三:Handler+Looper+MessageQueue深入详解》