(https://juejin.im/post/6844903801221038093#heading-5)
handler是负责异步消息处理的一种机制,其中Looper负责创建messageQueue,在一个无限循环中不断取出message,然后回调调用处理函数进行处理,消息的创建者就是一个或多个Handler。
android将事件封装成了message,然后一次放进messagequeue中进行依次处理。
messagequeue的next方式是阻塞式的从中取出一个message.
每个线程都只能有一个looper(looper将实例放在threadlocal中),主线程的looper是系统自动创建的,开启新线程的话要创建looper以创建和绑定消息队列。looper的loop()是一个无限循环,不断从MessageQueue中去取消息, 调用msg.target.dispatchMessage(msg)。
msg.target:sendmessage方法最后都是调用了enqueueMessage方法,里面将msg的target设置为当前线程handler,所以target是一个handler类型变量且储存了发送message线程的信息。
Handler通过构造函数引入当前线程的looper来和looper以及messagequeue关联。
message有when属性,记录了message执行的时间,messageQueue凭借这个给message进行排序以让其按顺序被取出。
dispatchMessage()会先判断是否是通过Post系列的方法将message放入消息队列(是否有Runnable类型的msg.callback),如果有的话就调用handleCallback(msg),也就是post的run(),不然就调用handlemessage来处理。其实post的Runnable没有创建新的线程,只是发送了一条消息,其本质也是调用了sendmessage方法,只不过是把操作写在了run中。
Handler内存泄漏:非静态内部类会持有外部类的引用,如果其他线程只有handler引用而且没有被销毁则Activity会一直被Handler持有引用而无法导致回收。而且messagequeue中如果有没有处理完的message,message的Target也是对Activity的引用,导致内存泄漏。可以使用静态内部类创建handler然后使用弱引用来获取外部类进行操作,在外部类对象被销毁时,将MessageQueue中的消息清空。比如activity的onDestory();
Handler
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 好记性不如烂笔头。 这是一个系列文章,...
- 文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章。 关于Handler的博客可谓是俯拾皆是,而...
- 【Android Handler 消息机制】 前言 在Android开发中,我们都知道不能在主线程中执行耗时的任务...