Android单线程模型
- UI Thread
- thread Local
- Looper
- Message Queue
-Handler
UI Thread
- 即主线程,该线程属于不安全线程并且刷UI的行为必须在该线程执行。
- 管理界面中的UI控件,进行事件分发
- 该线程在运行期间会通过Looper对象不断遍历Message Queue中的消息,并将其中的消息发送至该消息所指定的Handler对象。
thread Local
- Android消息机制中的消息池
- 通过消息池,Handler对象创建消息对象时会优先从消息池中获取,如果消息池中不存在消息对象的话便会在消息池中创建一个消息对象
- 该机制可以有效减少系统的垃圾回收行为。因为通过消息池,消息对象在不被使用时并不会被销毁而是放入消息池中,当下次需要创建消息对象时会复用消息池中已有的对象
Looper
- 用于线程间通信过程中的消息管理,每个线程都有其对应的Looper对象
- 每个Looper对象都有一个指向其所在线程的指针和一个指向MessageQueue的指针。
Message Queue
- 消息队列,在Looper初始化时创建,通过Looper管理
- Handler将发送出去的消息push到MessageQueue(其Looper指向的MessageQueue,其Looper是哪个线程的Looper由你来决定,Handler和你所指定的线程共享该Looper指向的MessageQueue)
Handler
- Handle用于线程间的通信
- Handle对象中包含了一个指向Looper和该Looper指向的MessageQueue的指针
总结
通过Handler进行线程间通信的流程:new一个Handle对象H并指定H的Looper,H发送消息,该消息将被push到Looper的消息队列MessageQueue中。Looper所属的线程会通过Looper将MessageQueue中的消息发回给与其共享一个MessageQueue的H,H回调他的handleMessage方法并接收该消息做为参数
总而言之就是通过一个Looper绑定线程A和Handle对象H,之后可以通过H在另一个线程B中发出消息(可携带数据),消息会被push到该H中Looper指针所指向的MessageQueue,此时与H绑定在一起的A就会收到消息,A收到消息之后会通过Looper将该消息作为参数回调该消息所指定的Handle对象的handleMessage方法
示例:子线程B跟子线程C说你去通知主线程A来刷UI
public class Dxc extends Activity{
private Button b;
private mhandler2 m2;
Handler han=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
b.setText("啊。。。。。。");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.handler_main);
//子线程B
new Thread(){
public void run(){
SystemClock.sleep(10000);
Looper.prepare();
mhandler1 m1=new mhandler1(Looper.myLooper());
m1.sendEmptyMessage(0);
Looper.loop();
}
}.start();
//子线程C
new Thread(){
public void run(){
Looper.prepare();
m2 = new mhandler2(Looper.myLooper());
while(m2.yes){
SystemClock.sleep(1000);
if(!m2.yes){
m2.sendEmptyMessage(0);
break;
}
}
Looper.loop();
}
}.start();
}
class mhandler1 extends Handler{
public mhandler1(Looper looper) {
super(looper);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
m2.yes=false;
}
}
class mhandler2 extends Handler{
private boolean yes=true;
public mhandler2(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
han.sendEmptyMessage(0);
}
}
}