handle原理 面试题
1、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。
handler是什么:Handler是Android SDK中处理异步类消息的核心类,其作用是让子线程通过与UI通信来更新UI界面
消息机制是什么:Android中的消息机制主要指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑
为什么不能在子线程中访问UI?:因为Android的UI控件并不是线程安全的,如果多线程中并发访问可能导致UI控件处于不可预期的状态.
那为什么系统不对UI控件的访问加上锁机制呢?:首先,加上锁机制会让UI访问的逻辑变得复杂;其次锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行.
为什么通过Handler能实现线程的切换:UI线程通过threadLocal创建looper,实现线程单例