又到了對于程序猿的跳槽的黃金季節(jié)(金三銀四),面試是一個必須經(jīng)歷的環(huán)節(jié)涛漂,不得不開始一遍又一遍的刷題革砸,遇到不會的開始google喊废,度娘……
當(dāng)一個問題掌握的不是刨根問底式的扎實氮墨,一不小心被較(惡)真(毒)面試官的刨根的話纺蛆,會顯得很尷(sha)尬(x),下面開始舉例……
(頭像)面屎官:你項目里哪里用到了rxjava……
(頭像) __me : 網(wǎng)絡(luò)請求的時候……
(頭像)面屎官:具體用來干什么……
(頭像) __me : 用來切換線程……
(頭像)面屎官:為什么要切換線程……
(頭像) __me : 因為子線程不能更新ui(脫了褲放屁,你問個有技術(shù)含量的好不好)
(頭像)面屎官:為什么子線程不能更新ui
(頭像) __me : 因為……………………(我去规揪,會崩掉呀)
當(dāng)然了桥氏,崩掉是必然的,但是為了滿足面屎官的好奇心猛铅,必須一探究竟
一段測試代碼
點擊控件字支,logcat會報如下錯誤:
跟蹤錯誤日志點進去
發(fā)現(xiàn)在setText()的時候,會檢查線程是否屬于Ui線程,否則就會拋出異常
有一種情況:在onCreate()或者onStrart()方法中開啟子線程更新ui就不會拋出異常奸忽,追蹤源碼
發(fā)現(xiàn)檢查線程的調(diào)用在onResume()之后初始化實例
到現(xiàn)在還是沒有回答面試的問題堕伪,為什么不在子線程中更新ui,google為什么這么設(shè)計月杉,原理其實不難理解刃跛,主要問題是java的線程安全抠艾,如果不在主線程更新ui苛萎,多個子線程同時給TextView設(shè)值,TextView的顯示就會出現(xiàn)問題检号,不知道最終顯示哪一個線程的值
rxjava也好腌歉,asyncTask也好,祖宗都是thread+handler齐苛,為什么通過handler切換線程就可以了呢翘盖,調(diào)用handler的sendMessage方法,發(fā)送message到主線程的messageQueue,loop循環(huán)取出凹蜂,然后處理馍驯,全部的操作在同一個線程中排序執(zhí)行阁危,從而避免引發(fā)線程安全。
總結(jié)汰瘫,子線程不能更新ui的原因就是為”線程安全“考慮狂打。