欢迎使用CSDN-markdown编辑器

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); 

     }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值