网上很多文章介绍handler 跟 looper,看别的人 总归没有自己记录一下印象深刻些,因此在此记录一下
简单new一个handler,跟进源码可以看到里面有几个重载方法,最终都是调用这个方法
这里核心的代码 就是 mLooper = Looper.myLooper(); 然后通过mLooper.mQueue获取消息队列,Looper等会再说
全局搜一下这个mQueue 就会发现,所有的删除、接收、发送消息,其实就是对mQueue这个消息队列进行处理
删除:
发送:
不管是post,还是sendmessage...跟进去一下,最后都是调用mQueue.enqueueMessage方法,把消息存到消息队列里面
再来说说Looper
首先要明确的是 所有线程有且只有一个Looper,应用在启动的时候,系统就自己给我们创建了一个Lopper并与主线程绑定了
Looper 主要有perpare跟loop两个方法
perpare 方法主要是初始化lopper,将普通线程变为looper线程并创建消息队列
loop方法主要是在消息队列里面循环取数据(重新整理了一下,只保留关键代码)
可以看到,这是一个死循环,如果消息队列里面有消息,就调用msg.target.dispatchMessage
msg.target就是handler,最终就是回调我们常见的handleMessage方法
对了 主线程一直也在执行loop方法,之所以没有OOM,是因为线程一直在执行,并且,可以休眠
到此,结束