Android开发艺术探索 第十章 学习

为什么从第十章开始呢,因为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,looper发现新消息就去调用对应的runnable或者handleMessage.

11,ThreadLocal在不同线程对象中所存储的指相互没有联系。这也是他loacl的含义。

未完待续





你可能感兴趣的:(android,app)