UI 线程的什么
Zygote fork出的线程就是UI线程。
zygote创建App的过程中调用ActivityThread类的main()方法,main中会自行Looper.loop();
。
主线程如何工作
- handler
- loop
- messageQueue
如果把UI设计成线程安全的
那么需要对控件加锁,哪一个线程拿到锁才能设置UI。
UI为什么不设计成线程安全的
- UI具有可变性,甚至是高频可变性
- UI对响应时间的敏感性要求UI操作必须高效
- UI组件必须批量绘制来保证效率
加锁可以变成线程安全,但是加锁是有性能开销的,会使UI的整体性能下降
非UI线程一定不能更新UI吗
SurfaceView可以在非UI线程更新UI:
lockCanvas -> draw -> unLockCanvasAndPost