美文网首页Android
面试别再问我子线程为什么不能更新UI了

面试别再问我子线程为什么不能更新UI了

作者: 148112b653f3 | 来源:发表于2019-03-11 22:37 被阅读0次

又到了对于程序猿的跳槽的黄金季节(金三银四),面试是一个必须经历的环节,不得不开始一遍又一遍的刷题,遇到不会的开始google,度娘……

当一个问题掌握的不是刨根问底式的扎实,一不小心被较(恶)真(毒)面试官的刨根的话,会显得很尴(sha)尬(x),下面开始举例……

(头像)面屎官:你项目里哪里用到了rxjava……
(头像) __me : 网络请求的时候……
(头像)面屎官:具体用来干什么……
(头像) __me : 用来切换线程……
(头像)面屎官:为什么要切换线程……
(头像) __me : 因为子线程不能更新ui(脱了裤放屁,你问个有技术含量的好不好)
(头像)面屎官:为什么子线程不能更新ui
(头像) __me : 因为……………………(我去,会崩掉呀)

当然了,崩掉是必然的,但是为了满足面屎官的好奇心,必须一探究竟

一段测试代码


WechatIMG1689.jpeg

点击控件,logcat会报如下错误:


WechatIMG1688.jpeg

跟踪错误日志点进去


WechatIMG1690.jpeg
发现在setText()的时候,会检查线程是否属于Ui线程,否则就会抛出异常
有一种情况:在onCreate()或者onStrart()方法中开启子线程更新ui就不会抛出异常,追踪源码

发现检查线程的调用在onResume()之后初始化实例


WechatIMG1691.jpeg
到现在还是没有回答面试的问题,为什么不在子线程中更新ui,google为什么这么设计,原理其实不难理解,主要问题是java的线程安全,如果不在主线程更新ui,多个子线程同时给TextView设值,TextView的显示就会出现问题,不知道最终显示哪一个线程的值

rxjava也好,asyncTask也好,祖宗都是thread+handler,为什么通过handler切换线程就可以了呢,调用handler的sendMessage方法,发送message到主线程的messageQueue,loop循环取出,然后处理,全部的操作在同一个线程中排序执行,从而避免引发线程安全。
总结,子线程不能更新ui的原因就是为”线程安全“考虑。


webwxgetmsgimg.jpg

相关文章

  • 面试别再问我子线程为什么不能更新UI了

    又到了对于程序猿的跳槽的黄金季节(金三银四),面试是一个必须经历的环节,不得不开始一遍又一遍的刷题,遇到不会的开始...

  • Android 子线程更新UI了解吗?

    前言 今天一个朋友去面试,被问到 为什么Loop 死循环而不阻塞UI线程? 为什么子线程不能更新UI?是不是子线程...

  • Android中为什么不能在子线程中更新UI

    点击查看 原因: 这个只解释了如果在子线程更新UI为什么会抛异常;真正不能再自在子线程更新UI的原因是:UI控件非...

  • Android系列:彻底了解Handler

    一、Handler 1.1 Android为什么==非ui线程==不能==更新ui== UI线程的机制 为什么UI...

  • 从顶层设计的角度对Android ANR机制的一些思考

    “不能在子线程中更新UI”“主线程不能做耗时操作” 这些话被我们奉为圭臬,但有多少人想过为什么不能在子线程中更新U...

  • 如何做到在子线程更新 UI?

    一般来讲,子线程是不能更新 UI 的,如果在子线程更新 UI,会报错。 但在某种情况下直接开启线程更新 UI 是不...

  • Handler源码讲解+手写机制

    摘自BAT面试宝典视频 问题引入:点击后更新TextView重点:1 、不能在子线程更新UI2、OOM:HAndl...

  • 总结1

    1.为什么子线程不能访问更新Ui在onCreate方法中创建了子线程并访问UI,没有崩溃,因为ViewRootIm...

  • 子线程更新UI的方法

    子线程中不能直接更新UI,如果直接更新的话会发生崩溃所以要在主线程中更新UI,总计三种回到主线程更新UI的方式 1...

  • Android多线程

    1.沿用java的子线程创建 2.在子线程中不能更新UI,那么在Android中更新UI的方法 runOnUiTh...

网友评论

    本文标题:面试别再问我子线程为什么不能更新UI了

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