Android子线程真的不能更新UI么

https://www.cnblogs.com/lao-liang/p/5108745.html

总结:
  1. 首先这个问题的答案是可以,但是要打个问号
  2. 想在非ui线程中更新ui,系统提供了如下方法

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler

  1. 单线程模型:
    就是主线程负责更新ui,通过消息队列模型来处理ui更新

  2. 那Android的UI操作并不是线程安全的又是怎么回事?
    Android实现View更新有两组方法,分别是invalidate和postInvalidate。前者在UI线程中使用,后者在非UI线程中使用。换句话说,Android的UI操作不是线程安全可以表述为invalidate在子线程中调用会导致线程不安全。作一个假设,现在我用invalidate在子线程中刷新界面,同时UI线程也在用invalidate刷新界面,这样会不会导致界面的刷新不能同步?既然刷新不同步,那么invalidate就不能在子线程中使用。这就是invalidate不能在子线程中使用的原因。

  3. ViewRootImpl.checkThread会抛出CalledFromWrongThreadException异常,ViewRootImpl是在Activity的onResume中创建的,所以如果在onCreate中创建子线程更新ui是不会抛出异常的,但是此时并不是更新ui,只是改变了ui的属性,还没有被真正的渲染出来,这就是为什么1.中提到的要打问号的原因

  4. 最后总结,android的ui更新是单线程模型,默认只希望主线程更新,如果非要在子线程中更新ui是线程不安全的,可能会抛出CalledFromWrongThreadException异常

你可能感兴趣的:(Android子线程真的不能更新UI么)