Android非主线程更新UI

251 阅读1分钟

首先Android官方并不支持这种做法。Android是单线程模型,如果支持多线程修改View,则线程同步和线程安全问题会使Android的系统设计非常复杂。

举两个情况的例子:

  1. 在某个Button的点击事件里新建线程对TextView进行setText,必崩Only the original thread that created a view hierarchy can touch its views(只有创建View层次结构的线程才能修改View)
  2. 在onCreate里新建线程对TextView进行setText,绝大多数情况不会崩溃

原因:

  1. setText会做invalidate操作更新ui,最终会走到ViewRootImpl.checkThread里,检查线程是不是ui线程,所以报错。
  2. onCreate时,view还没画出来,setText不会invalidate,相当于只修改了TextView的属性,所以不会走checkThread,不会报错。但如果这个线程耗时较长,actvity生命周期已经到onResume了,那就会崩溃。

非主线程中更新ui的方式:

  1. 使用Thread+Handler实现非UI线程更新UI界面
  2. 使用View的post方法来更新UI
  3. 使用Activity.runOnUiThread(runnable)的方法来更新UI