android的ui線程嗎
『壹』 android 哪些操作需要在ui 線程中
anroid系統中UI線程負責向UI組件分發事件(包括繪制事件),並處理用戶和應用之間交互。
做一些比較耗時的工作比如訪問網路或者資料庫查詢,都會阻塞UI線程,導致事件停止分發(包括繪制事件)。對於用戶來說,應用看起來像是卡住了,更壞的情況是,如果UI線程blocked的時間太長(大約超過5秒),用戶就會看到ANR(application not responding)的對話框。
因此在ui線程做耗時非常短,不會發生阻塞的操作
『貳』 android 為什麼要設計ui線程
UI線程,即主線程。為何將UI線程和其他事物線程,是由於其他事務處理會需要更多的時間去載入,也就是所謂的耗時操作,這樣不會導致頁面載入需要很久(至少畫面出來了,數據可以略慢)。設計UI線程是為了使得程序能夠獨立完成界面載入不受其他線程影響速度。
『叄』 Android UI線程
思考:
先必須了解下面2個問題
1.顧名思義 UI線程 就是刷新UI 所在線程
2.UI是單線程刷新
1.對Activity 來說 UI線程就是其主線程
2.對View來說 UI線程就是創建ViewRootImpl所在的線程
可以通過 WindowManager 內部會創建ViewRootImpl對象
好了,進入主題。我們來慢慢揭開面紗。
我們可以分別從幾個方面切入
我們可能都有使用過 runOnUiThread 現在來看看的源碼實現。
可以從上面的源碼 看到
不是UI線程 就用Handler切到Handler所在的線程中,如果是UI線程直接就調用run方法。
Activity的創建:
1.Activity創建:mInstrumentation.newActivity
2.創建Context :ContextImpl (r)
我們經常用這個方法乾的事情就是,要麼在onCreate中獲取View寬高的值。要麼就是在子線程中做一些耗時操作 ,然後post切到對應View所在的線程 來繪制UI操作。那麼這個對應的線程就是UI線程了。
那麼這個UI線程就一定是主線程嗎?
接來繼續來看。它的源碼View:post
mAttachInfo 在dispatchAttachedToWindow 中被賦值 ,也就是在ViewRootImpl創建的時候,所以是創建ViewRootImpl所在的線程。
attachInfo 上面時候為null 呢?在ViewRootImpl 還沒來得及創建的時候,ViewRootImpl 創建是在 「onResume" 之後。所以在 Activity 的 onCreate 去View.post 那麼AttachInfo 是為null 。
當 AttachInfo == null 那麼會調用 getRunQueue().post(action) 。
最終這個Runnable 被 緩存到 HandlerActionQueue 中。
直到ViewRootImpl 的 performTraversals 中 調用dispatchAttachedToWindow(mAttachInfo, 0);, 那麼才會去處理 RunQueue() 中的Runnable。
來張圖 便於理解這個流程
我們有時候去子線程操作UI的時候(如:requestLayout),會很經常見到下面的 報錯日誌:
Only the original thread that created a view hierarchy can touch its views
為什麼會報這個錯誤呢?
翻譯一下:只有創建視圖層次結構的原始線程才能接觸到它的視圖。
也就是操作UI的線程要和ViewRootImpl創建的線程是同一個線程才行,並不是只有主線程才能更新UI啊。
ViewRootImpl創建的線程?那麼 ViewRootImpl 在哪裡被創建的呢?
從上圖可以看到ViewRootImpl創建最開始是從 ActivityThread 的HandleResumeActivity中開始 一直 ViewRootImpl 創建,也就是說ViewRootImpl 對應的UI線程和 ActivityThread 在同一個線程 也就是主線程。
好了 通過上面的講解,上面的問題相信你可以自己回答啦~
『肆』 為什麼 Android 的 UI 框架使用單線程模型,比多線程模型有什麼優點
·如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換。·的線程需要的內存空間。·線程可能會給程序帶來「bug」,因此要小心使用。·線程的中止需要考慮其對程序運行的影響。·通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。一些線程模型的背景可以重點討論一下在Win32環境中常用的一些模型。·單線程模型在這種線程模型中,一個進程中只能有一個線程,剩下的進程必須等待當前的線程執行完。這種模型的缺點在於系統完成一個很小的任務都必須佔用很長的時間。·塊線程模型(單線程多塊模型STA)這種模型里,一個程序里可能會包含多個執行的線程。在這里,每個線程被分為進程里一個單獨的塊。每個進程可以含有多個塊,可以共享多個塊中的數據。程序規定了每個塊中線程的執行時間。所有的請求通過Windows消息隊列進行串列化,這樣保證了每個時刻只能訪問一個塊,因而只有一個單獨的進程可以在某一個時刻得到執行。這種模型比單線程模型的好處在於,可以響應同一時刻的多個用戶請求的任務而不只是單個用戶請求。但它的性能還不是很好,因為它使用了串列化的線程模型,任務是一個接一個得到執行的。·多線程塊模型(自由線程塊模型)多線程塊模型(MTA)在每個進程里只有一個塊而不是多個塊。這單個塊控制著多個線程而不是單個線程。這里不需要消息隊列,因為所有的線程都是相同的塊的一個部分,並且可以共享。這樣的程序比單線程模型和STA的執行速度都要快,因為降低了系統的負載,因而可以優化來減少系統idle的時間。這些應用程序一般比較復雜,因為程序員必須提供線程同步以保證線程不會並發的請求相同的資源,因而導致競爭情況的發生。這里有必要提供一個鎖機制。但是這樣也許會導致系統死鎖的發生。進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變數和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。多線程可以實現並行處理,避免了某項任務長時間佔用CPU時間。要說明的一點是,到2015年為止,大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。C++11標准中,STL類庫也實現了多線程的類std::thread,使得多線程編程更加方便。
『伍』 android開發非UI線程和UI線程區別詳解,請回答專業知識謝謝。
UI線程,即主線程,在主線程里不能進行耗時的操作,不然系統會彈出ANR提示框,所以一般的耗時操作都是放到非UI線程里去完成,即子線程。目前在開發層面的區別應該主要是這個吧,其它的暫時沒聽說。
『陸』 android怎麼讓代碼在UI線程運行
稍微有過Andorid開發經驗的同學都知道,Android開發中涉及到UI變動的操作,必須在主線程中執行, 否則會crash
這就需要我們將代碼拋到主線程執行。
第一種方式,是通過Activity.runOnUiThread()來做。這不是一個好方法,畢竟Activity這種東西,在子線程中可遇不可求。也千萬不要因此而將Activity傳來傳去,甚至對Context進行強轉,那樣太過難看。
那麼,只剩下通過Handler手動將代碼拋到主線程了。這就需要,Handler具有主線程的Looper對象。具體的原因可以參考我之前的博客:【Android】結合源碼解析Android消息隊列工作流程 。
兩種實現方式:
1. 在主線程中創建Handler
2. 直接通過MainLooper,構造handler
http://blog.csdn.net/u013015161/article/details/52760207
『柒』 在android中!什麼叫ui線程!和主線程的區別是什麼
UI線程就是主線程 你在更新UI時必須要在主線程中更新 所以說也叫UI線程