UI的執行緒問題:單執行緒原因及更新UI的四種方式
阿新 • • 發佈:2019-02-19
1、UI執行緒為什麼設計為單執行緒?
UI控制元件的操作不是執行緒安全的,對於多執行緒併發訪問的時候,如果使用加鎖機制會導致:
- UI控制元件的操作變得很複雜。
- 加鎖的操作必定會導致效率下降。
所以android系統在UI操作上使用單執行緒機制。
2、更新UI有四種方式:
- 使用Handler訊息傳遞機制:通過直接傳送message,即sendMessage(); ;
- 使用AsyncTask非同步任務;
- 使用runOnUiThread(action)方法;
- 使用Handler的post(Runnabel r)方法:通過傳送Runnable介面,即Post(Runnable)這種方式最終會呼叫sendMessageDelayed;
Handler的post對執行緒的處理也不是真正start一個新的執行緒,而是直接呼叫了執行緒的run方法,這正是google煞費苦心搞一套
3、小結:
A 如果只是單純的想要更新UI而不涉及到多執行緒的話,使用View.post()(view再封裝,最終呼叫的還是handler.post())就可以了;
B 需要另開執行緒處理資料以免阻塞UI執行緒,像是IO操作或者是迴圈,可以使用Activity.runOnUiThread();
C 如果需要傳遞狀態值等資訊,像是藍芽程式設計中的socket連線,就需要利用狀態值來提示連線狀態以及做相應的處理,就需要使用Handler + Thread的方式;
Handler的作用:主要是在其他後臺執行緒中,通過handler這個媒介,向UI主執行緒傳送Runnable物件(即程式碼段)
採用傳遞訊息的方式,呼叫Handler中方法來處理訊息更新檢視。這種方式對於不是很頻繁的呼叫是可取的。如果更新的較快,則訊息處理會一直排隊處理,這樣顯示會相對滯後。
D 如果是後臺任務,像是下載任務等,就需要使用AsyncTask。