Android应用程序有两大机制:消息机制和事件处理机制
今天我们来简单谈下消息机制
一、基本元素
Looper:消息管理器,管理Message Queue。
Message:消息
Message Queue:消息队列。
Looper会不断地从MessageQueue中去取消息进行发送到Handler中进行处理(确切是handleMessage中进行处理)
二、创建绑定不同线程的Handler
Handler会与一个线程绑定而且只能与一个线程绑定,在这个线程中,该Handler会有相应的Looper进行取Message,然后发送到handleMessage()去处理。
1、创建主线程的Handler
(1)在主线程中new Handler的自定义子类,如new MyHandler();(MyHandler extends Handler)
在主线程中,自动创建了一个Looper和MessageQueue,而在其他线程中需要手动创建Looper。
(2)在其他线程创建主线程的Handler,
Handler handler = new MyHandler(Looper.getMainLooper());
无需Looper.prepare()和Looper.loop(),因为主线程会自动创建一个Looper和自动循环取Message。
一个线程只能帮到一个Looper对象。
只有在主线程的Looper的Handler才能进行UI操作。
2、创建其他线程的Looper相关的Handler
(1)在非UI线程(主线程),需要手动创建Looper,
OtherHandler mHandler;
Looper.prepare();//创建Looper代码
mHandler = new OtherHandler(Looper.myLooper());//创建于该Handler相绑定的Looper为该线程
Looper.loop();//循环刚创建的该线程的Looper的MessageQueue
进行消息发送
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "XXX";
mHandler.sendMessage(msg);
(2)指定某线程的Looper:
Handler mHandler = new Phandler(AThread.getLooper());
三、重点
重点是理解handler的机制原理,looper在一个线程中不断地进行循环取消息message工作,也就意味着这个线程有某个时刻会被占有执行该handler的相应代码和looper的工作,频繁的发送消息有可能会导致该线程的不堪重负,主线程的话,可能会ANR。所以如果可能会频繁发送消息的情形应该放在子线程进行。
而掌握API则可以查询相关的手册。
今天的分享就到这里,谢谢。