1、不允许在子线程中访问UI?
UI控件非线程安全,多线程中并发访问会导致UI控件处于不可预期的状态。
UI控件不上锁机制的原因有:
上锁会让UI控件变得复杂和低效
上锁后会阻塞某些进程的执行
2、Handler.postDelayed()是否精确延时?
当上一个消息存在耗时任务的时候,会占用延时任务执行的时机,当上一个任务耗用总时超过上下任务执行时间的时间差时,后一个任务会被延时,此时是不准确的。如果需要保证任务准时执行,我的理解是,务必将耗时操作放入子线程,任务执行完时,将UI更新部分利用Handler机制切换回主线程,不要利用Handler去实现一些类似于界面动画的工作。
3、Looper.loop()在什么情况下会退出?
next方法返回的msg == null
线程意外终止
4、Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源
Linux多路复用Epoll:https://www.cnblogs.com/cielosun/p/10614351.html
5、IdleHandler使用场景
合适场景可以从下面几点出发:
消息队列相关、主线程能干的事情、返回true和false带来不同结果
目前可以想到的场景:
1.Activity启动优化:onCreate,onStart,onResume中耗时较短但非必要的代码可以放到IdleHandler中执行,减少启动时间
2.想要一个View绘制完成之后添加其他依赖于这个View的View,当然这个View#post()也能实现,区别就是前者会在消息队列空闲时执行。
3.发生一个返回true的IdleHandler,在里面让某个View不停闪烁,这样当用户发呆时就可以诱导用户点击这个View,这也是种很酷的操作。
4.一些第三方库中使用,比如LeakCanary,Glide中使用到,具体可以自行去查看。
参考:https://blog.csdn.net/merbn/article/details/97282364
参考:
原理浅析: https://www.jianshu.com/p/a1d945c4f5a6
使用场景: https://blog.csdn.net/feather_wch/article/details/81136078