為什麼還說Android的UI操作並不是執行緒安全的

2021-03-19 18:20:06 字數 1508 閱讀 9345

1樓:育知同創教育

非ui執行緒中重新整理介面的時候,ui執行緒也在重新整理介面,多個介面重新整理的操作不能同步,導致執行緒不安全。

android 子線**的不能操作ui麼

2樓:

在開發應用中,如果子執行緒中更新ui會丟擲異常,但並不是因為只有ui執行緒才能更新ui,

而是因為viewrootimpl會進行檢查,如果 mthread!=當前執行緒 時會丟擲異常calledfromwrongthreadexception異常

viewrootimple.java

void checkthread()

} 那mthread是什麼呢?

public viewrootimpl(context context, display display)

而viewrootimpl是在主執行緒中建立的,所以,才需要在主執行緒中更新ui

不過,設定為在主執行緒更新ui也是為了安全和簡化起見吧

那麼,能否在子執行緒中更新ui呢

如果viewrootimpl是由子執行緒創造的,那麼自然可以在該子執行緒中更新ui

但是如果我們直接建立viewrootimpl例項的話,會發現找不到該類。

可以通過windowmanager.addview來間接建立一個viewrootimpl

比如class testthread1 extends thread

}mainactivity是建立android工程時生成的入口類,testthread1是mainactivity的內部類。感興趣的話,試試吧!看看是不是在螢幕上看到了」test11111111111111111」?

具體建立viewroot的地方在wm.addview(tx, params)

具體流程:

windowmanagerimpl.addview(view view, viewgroup.layoutparams params)

->windowmanagerimpl.addview(view view, viewgroup.layoutparams params, boolean nest)

**(精簡):

public void addview(view view, viewgroup.layoutparams params,

display display, window parentwindow)

root.setview(view, wparams, panelparentview);}

3樓:安徽電信網上營業廳

當一個程式第一次啟動的時候,android會同時啟動一個對應的主執行緒,這個主執行緒就是ui執行緒,也就是activitythread。ui執行緒主要負責處理與ui相關的事件,如使用者的按鍵點選、使用者觸控式螢幕幕以及螢幕繪圖等。系統不會為每個元件單獨建立一個執行緒,在同一個程序裡的ui元件都會在ui執行緒裡例項化,系統對每一個元件的呼叫都從ui執行緒分發出去。

所以,響應系統**的方法永遠都是在ui執行緒裡執行,如響應使用者動作的onkeydown()的**。

Android的UI底層是用CPU繪圖的還是GPU繪圖的呢

安卓有2種繪製模型 一 軟體繪製模型,這裡由cpu主導繪圖,檢視按照以下2個步驟繪圖。讓檢視結構 view hierarchy 失效。繪製整個檢視結構。當應用程式需要更新它的部分ui時,都會呼叫內容發生改變的view物件的invalidate 方法。無效 invalidation 訊息請求會在vie...

為什麼諾基亞不用android系統

谷歌在推出android初期,曾經找過諾基亞,但諾基亞沉浸在symbian的巨大成功中,沒能慧眼識珠。設想一下,如果諾基亞第一個使用android系統,那無異於龍入水,虎添翼,哪能輪到摩托羅拉風光無限?其霸主地位自然是 臥榻之側,凱容他人酣睡 甚至iphone都難以對其構成威脅。但諾基亞沒能把握這次...

為什麼有些UI設計師找不到工作,轉行UI設計,一直找不到工作,該怎麼辦?

不是找不到工作,只是你不願意去找!建議 做好準備!招聘公司看中的是招聘人的是否有實力勝任這個崗位 想自己培養的公司除外 所以第一步要做的是要讓公司看到你的實力,做為實習生在學校做的案例可以拿出來給招聘公司看。一般招聘公司招聘設計師都是先看設計師的設計案例的,一般有設計案例的人被邀請面試的概率大一倍。...