Android为什么非UI线程不能更新UI

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