美文网首页
Android子线程真的不能更新UI么

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

作者: breaktian | 来源:发表于2018-09-14 23:44 被阅读12次

    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么

          本文链接:https://www.haomeiwen.com/subject/aizagftx.html