为什么从第十章开始呢,因为Android开发艺术探索这本书每一章基本都没有什么联系。
所以我们可以从任意一章开始读起。
怎么选择要读哪一章呢,个人认为是根据自己的喜好以及时间片来决定比较合理。
比如我对ThreadLocal比较有兴趣,上次本来要了解这个但是因为别的事没去看,加上我下午要出去时间短,而第十章内容又少。所以选择了第十章做破冰章。
读书就是这样子呀,开始读了第一张才后继续往后看。不然总是放在旁边。
加油,今天是2016年5月14日。
正式开始看书了。
记录要点:
1,Handler可以将一项任务切换到其所在线程中运行。这个线程不一定是主线程,任务也不一定是UI工作。话说真的有人认为handler只能用来更新UI么。。。
2,ThreadLocal并不是线程,它用来在线程中存储数据。一般在handler内部通过ThreadLocal来获取当前线程的Looper。
3,非UI线程默认没有looper,要先创建looper才能用handler。
4,关于Android如何知道UI操作是否在主线程中进行呢?
答案是:在ViewRootImpl的checkThread函数中会判断mThread也就是主线程是否与当前线程也就是Thread.currentThread()相同,如果不同就证明不是在UI主线程中进行UI操作。
5,作者认为handler的出现主要是为了解决子线程中无法访问UI的问题,这点不是很同意。个人觉得Handler是一种方法,他主要目的是在各个线程之间进行任务切换,当然现在可能大家用的比较多的是从子线程中切换到UI主线程。
6,子线程中为何不允许进行UI操作。答:因为UI控件一般是线程不安全的。多线程并发容易导致异常。
7,那么给UI控件访问加锁不就线程安全了么?答:1,加锁会让UI访问更加复杂,代码量更大,维护更加困难,稍不注意还容易引起死锁什么的。2,UI访问效率降低,加锁会降低UI访问效率。一个线程可能很久都阻塞在等待某个控件的权限。
简单的说,多个线程同时访问一个控件,那只有一个线程可以访问,其他线程都啥也做不了了,都阻塞了。
8,Handler必须依赖looper存在。非UI线程默认没有looper要自己创建。
9,Handler的post方法内部最终使用send来进行任务或者消息发送。可以传递的信息有msg和runnable。
10, handler负责发送消息给MessageQueue,
未完待续