https://www.cnblogs.com/lao-liang/p/5108745.html
总结:
- 首先这个问题的答案是可以,但是要打个问号
- 想在非ui线程中更新ui,系统提供了如下方法
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler
-
单线程模型:
就是主线程负责更新ui,通过消息队列模型来处理ui更新 -
那Android的UI操作并不是线程安全的又是怎么回事?
Android实现View更新有两组方法,分别是invalidate和postInvalidate。前者在UI线程中使用,后者在非UI线程中使用。换句话说,Android的UI操作不是线程安全可以表述为invalidate在子线程中调用会导致线程不安全。作一个假设,现在我用invalidate在子线程中刷新界面,同时UI线程也在用invalidate刷新界面,这样会不会导致界面的刷新不能同步?既然刷新不同步,那么invalidate就不能在子线程中使用。这就是invalidate不能在子线程中使用的原因。 -
ViewRootImpl.checkThread会抛出CalledFromWrongThreadException异常,ViewRootImpl是在Activity的onResume中创建的,所以如果在onCreate中创建子线程更新ui是不会抛出异常的,但是此时并不是更新ui,只是改变了ui的属性,还没有被真正的渲染出来,这就是为什么1.中提到的要打问号的原因
-
最后总结,android的ui更新是单线程模型,默认只希望主线程更新,如果非要在子线程中更新ui是线程不安全的,可能会抛出CalledFromWrongThreadException异常
网友评论