对handler的理解

handler消息处理机制
简单的说:一个线程开启一个无限循环模式,不断遍历自己的消息列表,如果有消息就挨个拿出来做处理,如果列表没消息,自己就堵塞(相当于wait,让出cpu资源给其他线程),其他线程如果想让该线程做什么事,就往该线程的消息队列插入消息,该线程会不断从队列里拿出消息做处理。


handler主要是对内部所持有的Loop内MessageQueue的管理,发送message是把message添加到所持有的Loop的MessageQueue中
如果要用handler接发message首先要运行Loop.prepare(),创建Looper对象,并通过ThreadLocal与当前线程绑定(具体操作是以当先线程作为key,Looper对象作为value,加入到ThreadLocalMap中),Looper构造里创建MessageQueue对象,然后调用Looper.loop通过无限循环的方式不断的从MessageQueue中调用queue.next()(MessageQueue是一个链表,通过message.next()指定下一个message)获取message,当没有message的时候阻塞,阻塞在nativePollOnce()的方法中,线程会释放CPU资源进入休眠状态,直到下一个消息到达或者有事务发生时,才通过往pipe管道写端写入数据来唤醒主线程工作。这里涉及到的是Linux的pipe/epoll机制,获取到message之后通过msg.target.dispatchMessage()进行消息分发,其中msg.target指的就是发送消息的handler,当通过post(Runnable)发送消息的时候是把msg.callback设值为runnable,在dispatchmessage的时候直接运行msg.callback.run(),dispatchMessage的优先级是 msg.callback -> mcallback -> handlemessage(msg)
对epoll的理解http://www.cnblogs.com/melons/p/5791788.html
epoll三大关键要素mmap(内存共享)、红黑树(共享的内存中epoll的存储方式)、链表(双向链表存储epoll被注册事件回调)
epoll在android中的使用
在MessageQueue的构造函数会调用nativeInit()方法,生成C++层的Looper对象,Looper.cpp的构造函数中会通过管道pipe创建读端和写端两个文件描述符,创建epoll并把读端文件描述符EPOLL_CTL_ADD(注册)进epoll,nativePollOnce()方法会调用Looper.cpp的pollInner方法,通过epoll_wait()阻塞,handler发送消息最终会调用MessageQueue.java的enqueueMessage方法,里面有个nativeWake()方法,会向管道写端写入一个字符"w",epoll监听到改动就释放阻塞,继续运行epoll_wait()后面的代码,里面有个awoken()方法会通过读端把pipe里面的东西全部读完清空,在nativePollOnce()之后的代码就是MessageQeueue.next()获得msg,并把msg发送出去,然后再循环从头开始,运行到MessageQeueue.next()阻塞


为什么在主线程调用Looper死循环不会卡死 点击打开链接
首先,主线程ActivityThread本身就是阻塞的(如果不阻塞,主线程从头执行到尾就结束了。。),并且这个阻塞就是用Looper.loop来实现的,ActivityThread里面有个内部类H继承自Handler,实现handlerMessage()用来处理发送到主线程的消息,activity的生命周期,service的处理等都是通过发送message的方式通知activitythread来处理,所以这是个伪命题,但是由此可以看到Handler在android中的重要性
创建handler对象有两种方式,一种是不指定Loop,前提是当前线程已经运行了Loop.prepare(),这时handler里的Loop指的就是当前线程的Loop,一种是直接指定Loop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值