1. 程式人生 > >android為什麼不允許在子執行緒中訪問UI

android為什麼不允許在子執行緒中訪問UI

首先,UI控制元件不是執行緒安全的,如果多執行緒併發訪問UI控制元件可能會出現不可預期的狀態

那為什麼系統不對UI控制元件的訪問加上鎖機制呢?
缺點有兩個:

  • 加上鎖機制會讓UI訪問的邏輯變得複雜;
  • 鎖機制會降低UI訪問的效率,因為鎖機制會阻塞某些執行緒的執行

鑑於這兩個缺點,最簡單且高效的方法就是採用單執行緒模型來處理UI操作,所以原始碼ViewRootImpl中會有對執行緒的一個判斷,程式碼如下:
frameworks/base/core/java/android/view/ViewRootImpl.java

    void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    }

對於開發者來說也不是很麻煩,只是通過handler切換一下UI訪問的執行執行緒即可