Android系統為什麼不允許線上程中訪問UI呢?

myhc發表於2015-11-10

我們都知道“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操作

相關文章