當前位置:成語大全網 - 書法字典 - Android UI線程

Android UI線程

思考:

妳必須首先理解以下兩個問題。

1.顧名思義,UI線程是刷新UI的線程。

2.UI是單線程刷新。

1.對於Activity,UI線程是其主線程。

2.對於View,UI線程是創建ViewRootImpl的線程。

您可以通過WindowManager內部會議創建ViewRootImpl對象。

好了,說重點。讓我們慢慢揭開面紗。

我們可以分別從幾個方面切入。

我們可能都用過runOnUiThread。現在讓我們看看源代碼實現。

妳可以從上面的源代碼中看到。

如果不是UI線程,則使用處理程序切入處理程序所在的線程,如果是UI線程,則直接調用run方法。

創建活動:

1.活動創建:小工具。新活動

2.創建上下文:上下文impl appcontextcreatebasecontextforactivity(r)。

我們通常用這種方法在onCreate中獲取視圖寬度和高度的值。或者在子線程中做壹些耗時的操作,然後post cuts到對應視圖所在的線程來繪制UI操作。那麽這個對應的線程就是UI線程。

那麽這個UI線程壹定是主線程嗎?

快點,繼續找。它的源代碼視圖:post

MAttachInfo是在dispatchAttachedToWindow中分配的,也就是在創建viewrootimpl時分配的,因此它是創建viewrootimpl的線程。

attachInfo什麽時候為空的?在創建ViewRoottimpl之前,ViewRoottimpl是在“onResume”之後創建的。因此,如果您在Activity的onCreate中訪問View.post,那麽AttachInfo為空。

當AttachInfo == null時,getRunQueue()。將調用post(操作)。

最終這個Runnable被緩存在HandlerActionQueue中。

直到在ViewRootImpl的performTraversals中調用dispatcheattachedtowindow(mattachinfo,0);然後我們將在RunQueue()中處理Runnable。

讓我們畫壹張圖來理解這個過程。

有時當我們去子線程操作UI時(如:requestLayout),我們會經常看到以下錯誤日誌:

只有創建視圖層次結構的原始線程才能接觸它的視圖

妳為什麽報告這個錯誤?

只有創建視圖層次結構的原始線程才能訪問它的視圖。

也就是說,操作UI的線程必須與ViewRootImpl創建的線程是同壹線程,並且不是只有主線程才能更新UI。

ViewRootImpl創建的線程?那麽ViewRootImpl是在哪裏創建的呢?

從上圖可以看出,viewrootimpl的創建從ActivityThread的HandleResumeActivity開始,壹直持續到viewrootimpl的創建,這意味著viewrootimpl和ActivityThread對應的UI線程在同壹個線程中,也就是主線程。

好了,通過以上講解,相信妳自己也能回答以上問題了~