Android系統為什麼不允許線上程中訪問UI呢?
我們都知道“Android系統不能在子執行緒中更新UI”
下面我們一塊揭開他的真面目。
直接原因:
如果在子執行緒中更新了,會怎麼樣?
一定會出現這樣的一條log
Only the original thread that created a view hierarchy can touch its views.
知道這個log是誰打的嗎?
ViewRootImpl -> checkThread()
我們來看一下該方法
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
"Only the original thread that created a view hierarchy can touch its views.");
}
}
在每一次UI更新時,均會觸發checkThread 方法,所以無法在子執行緒中更新UI的直接原因。
根本原因
Android的UI控制元件不是執行緒安全的,如果在多執行緒中併發訪問可能會導致UI控制元件處於不可預期的狀態。
那麼為什麼系統不對UI控制元件的訪問加上鎖機制呢?
缺點有兩個:
1.加上所機制會讓UI訪問的邏輯變的複雜;
2.鎖機制會降低UI訪問的效率,因為所機制會阻塞某些執行緒的執行。
如果你是系統的設計者,您應該怎麼處理?
google採用了最賤的最簡單的做法—-單執行緒處理模型來處理UI操作。
相關文章
- 為什麼hashtable不允許設定Null但是hashmap允許?NullHashMap
- 為什麼不允許程式碼裡出現“魔數”
- 【Java面試】Redis存線上程安全問題嗎?為什麼?Java面試Redis
- 系統許可權UNLIMITED TABLESPACE為什麼如此特殊?MIT
- 為什麼阿里巴巴Java開發手冊中不允許魔法值出現在程式碼中?阿里Java
- 蘋果mac電腦為什麼比win系統更安全呢?蘋果Mac
- 為什麼值型別不允許顯式定義無參建構函式型別函式
- 程式碼檢查過程中為什麼需要涉及到編譯呢?編譯
- 為什麼要學習作業系統課程?作業系統
- 為什麼網站訪問速度很慢網站
- Linux系統中501代表什麼許可權?Linux
- 為什麼要學習嵌入式系統課程?
- ui設計是什麼工資待遇呢?UI
- UI設計師需要學習什麼呢?UI
- 國內Windows系統盜版如此猖獗,微軟為什麼不追究呢?Windows微軟
- 系統訪問量怎麼算
- Flask: WinError 10013 以一種訪問許可權不允許的方式做了一個訪問套接字的嘗試FlaskError訪問許可權
- 我如何訪問jar中的xml呢?JARXML
- 【vue】為什麼v-for中需要一個key呢?Vue
- 訪問許可權控制系統|全方位認識 mysql 系統庫訪問許可權MySql
- Linux系統中執行許可權是什麼?rwx分別代表什麼?Linux
- win10系統c盤不允許拷入單個檔案怎麼辦_win10不允許往c盤拷檔案如何解決Win10
- Android Permission denied(不允許連線Socket) 錯誤Android
- CRM 系統的線上演示是什麼?有什麼作用?
- [作業系統]訪問一個邏輯地址發生了什麼作業系統
- AngularJS 為什麼如此火呢?AngularJS
- Linux系統中777許可權是什麼意思?Linux
- 什麼是垃圾蒐集(GC)?為什麼要有GC呢?GC
- Windows 8怎麼啟用分配訪問呢?Windows
- android自定義訪問許可權permissionAndroid訪問許可權
- android:各種訪問許可權PermissionAndroid訪問許可權
- 解決訪問共享印表機提示“使用者賬戶限制,不允許空密碼”的問題密碼
- 為什麼 go 中字串不能用下標訪問Go字串
- 為什麼訪問寶塔皮膚總是提示404?
- 微信分銷商城系統有什麼優勢呢?微商系統開發
- 為什麼說智慧線上客服系統對企業價值連城?
- 為什麼要使用CRM系統?
- 為什麼選擇centos系統CentOS