##子线程不能修改UI界面
android.os.NetworkOnMainThreadException:网络在主线程上的异常;
在主线程上有访问网络的操作。
在Android4.0之后,google强制要求在主线程(UI线程)中不能有访问网络的操作,这样就避免在主线程中因为访问网络时间比较长而导致界面卡死等现象的发生。
Only the original thread that created a view hierarchy can touch its views:
只有创建UI界面的线程才能修改UI界面,谁创建的界面谁才能修改。
运行activity的线程就是主线程(UI线程)。activity中的oncreate、单击事件的响应方法都是运行在主线程里面的。
使用Toast提示信息,也属于修改UI界面。
子线程不能直接修改UI界面,只有主线程(UI线程)才能修改UI界面。
子线程可以修改UI界面,修改UI界面之后,系统会自动判断当前线程是不是主线程,如果不是主线程,就会立即终止程序的运行。
##Handler消息处理机制的原理
1、在主线程中声明一个handler的成员变量;
2、在子线程中的handler的引用,调用它的发送消息的方法,告诉主线程我要修改界面。
3、主线程授权handler,修改UI界面。
模版代码:
//1、在主线程中声明一个handler的成员变量;
private Handler handler = new Handler(){
};
//2、在子线程中的handler的引用,调用它的发送消息的方法,告诉主线程我要修改界面。
//创建一个消息盒子
Message msg = new Message();
msg.obj = bm;
handler.sendMessage(msg);
//3、handler修改UI界面
private Handler handler = new Handler(){
//接收并处理消息
public void handleMessage(Message msg) {
//得到子线程发送过来的数据
Bitmap bm = (Bitmap) msg.obj;
//handler修改UI界面
iv.setImageBitmap(bm);
};
};
Handler消息处理机制的原理(Handler、Message、Looper三者之间的关系):
前提知识:所有使用UI界面的操作系统,后台都在运行着一个死循环,它在不停的监听和接收用户发出的指令,一旦接收到指令会立即执行。
Looper(轮询器):死循环。
Android的应用程序一启动的时候,系统就提供了Looper,Looper运行在主线程。Looper内部维护了一个消息队列,Looper内部的死循环在不停从消息队列中去消息。
Android的应用程序一启动的时候,系统就提供了Looper,Looper运行在主线程。
当在子线程中调用handler的引用发送消息(Message)给handler,handler把消息放置在Looper内部维护的消息队列(MessageQueue)中,Looper不停的从消息队列中取消息,取到消息后会发送给Handler,Handler拿到消息后修改UI界面。
Handler、Message、Looper三者之间的关系
最新推荐文章于 2022-08-26 15:48:43 发布