Handler消息机制及handler原理(Handler,Looper,MessageQueue),自定义Handler

Handler/Message/Looper/MessageQueue

-- 安卓为什么要设计Looper阻塞?
Android的应用程序和Windows应用程序一样,都是由消息驱动的。在Android操作系统中,谷歌也实现了消息循环处理机制。
1.Looper依赖于MessageQueue和Thread,每个Thread只对应一个Looper,每个Looper只对应一个MessageQueue(一对一)。
2.MessageQueue依赖于Message,每个MessageQueue中有N个待处理消息(一对N)。
3.Message依赖于Handler来进行处理,每个Message有且仅有一个对应的Handler。(一对一)
4.Handler中持有Looper和MessageQueue的引用,可直接对其进行操作。
5.Handler机制,即消息处理的机制,封装了一套消息创建、传递、处理机制。

-- 高级:NativeMessageQueue、 Native Looper
 获取消息首先调用nativePollOnce,从底层epoll(异步阻塞IO),发送消息加入消息队列首先会调用nativeWake,向管道写入字符,唤醒IO,从而MessageQueue.next()可以返回一个Message。
-- handler 的原理是什么?()

从源码深入理解Android Handler异步消息处理机制- https://blog.csdn.net/wdmzszly/article/details/81941116

Android消息机制源码解析(Handler)- https://blog.csdn.net/Awenyini/article/details/78593139

首先是Handler/Message/Looper/MessageQueue这些对象的初始化,然后才是使用这些对象进行消息处理。
1、handler封装消息的发送(主要包括消息发送给谁);
2、Looper——消息封装的载体。(1)内部包含一个MessageQueue,所有的Handler发送的消息都走向这个消息队列;(2)Looper.Looper方法,就是一个死循环,不断地从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞;
3、MessageQueue,一个消息队列,添加消息,处理消息;
4、handler内部与Looper关联,handler->Looper->MessageQueue,handler发送消息就是向MessageQueue队列发送消息。
总结:handler负责发送消息,Looper负责接收handler发送的消息,并把消息回传给handler自己。MessageQueue存储消息的容器。

private Handler handler;
public void sendMsg() {//
    //方法1
    Message msg = new Message();
    msg.what = 1;
    msg.arg1 = 2;
    msg.arg2 = 3;
    msg.obj = "demo";
    handler.sendMessage(msg);
    //方法2
    Message msg2 = handler.obtainMessage();
    //obtainMessage();
    //obtainMessage(what);
    //obtainMessage(int what,Object obj); 
    //obtainMessage(int what,int arg1,int arg2);
    //obtainMessage(int what,int arg1,int arg2,Object obj );
    msg2.what = 1;
    msg2.arg1 = 2;
    msg2.arg2 = 3;
    msg2.obj = "demo";
    msg2.sendToTarget();
    //方法3
    Message msg3 = Message.obtain();
    msg3.sendToTarget();
}

> Handler 消息机制
1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。
2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用该Message的target指向的Hander的dispatchMessage函数对Message进行处理。
    在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:
    1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;
    2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;
    3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。
    由此可见,我们实现的handleMessage方法是优先级最低的!

> Handler的机制与源码分析,及自定义Handler
Android Handler源码级分析及自定义Handler实现- https://blog.csdn.net/liurenyou/article/details/72805916
Android消息机制Handler解析(源码+Demo)-- http://m.blog.csdn.net/article/details?id=51031331
Handler 源码分析-- http://blog.csdn.net/miraclemin/article/details/6556620
Android】从源码中探讨Handler机制-- http://blog.csdn.net/rongxinhua/article/details/20576185
   假如在同一个Activity中,有多个线程同时更新UI,且没有加锁,那会导致什么问题呢?UI更新混乱。假如加锁呢?会导致性能下降。使用Handler机制,我们不用去考虑多线程的问题,所有更新UI的操作,都是在 主线程消息队列中轮询去处理的。]

> Handler 消息传递机制
message.sendToTarget();
/*1、message由handler创建,可直接向handler发送消息。msg.sendToTarget()*/
            Message msg = handler.obtainMessage();
            msg.arg1 = i;
            msg.sendToTarget();

/*2、message通过new的方式创建,可用handler.sendMessage(msg)来发送消息*/
            Message msg=new Message();
            msg.arg1=i;
            handler.sendMessage(msg);
            //直接调用 handler 的发送消息方法发送消息。

/* 3、message通过Message.obtain的方式创建,可用sendMessage(msg)来发送消息 */
           Message msg= Message.obtain();
           msg.arg1=i;
           handler.sendMessage(msg);

> Looper.getMainLooper()与Looper.myLooper();Looper.myLooper().quit(); Looper.getMainLooper().quit();
-- getMainLooper()
  Returns the application's main looper, which lives in the main thread of the application.
-- myLooper()
  Return the Looper object associated with the current thread. Returns null if the calling thread is not associated with a Looper.

boolean isUiThread = Looper.getMainLooper().getThread() == Thread.currentThread();
boolean isUiThread = Looper.getMainLooper().isCurrentThread();
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值