子執行緒中建立Handler可以嗎?(上)
本文包括與Handler有關的以下問題:
(1)Handler的作用
(2)為什麼Android中要設計為只能在UI執行緒中去更新UI呢?
(3)Handler的兩個異常
(4)Handler、Looper MessageQueue之間的關係(原始碼角度)
(5)跟執行緒相關的Handler,即HandlerThread(原始碼角度分析)
(6)主執行緒往子執行緒發訊息
一、Handler的作用:
(1)在非UI執行緒中完成耗時操作,在UI執行緒中去更新UI。
(2)可以在主執行緒中傳送延時訊息。
二、為什麼Android中要設計為只能在UI執行緒中去更新UI呢?
(1)解決多執行緒併發問題(根本原因)
(2)提高介面更新的效能問題
(3)架構設計的簡單
你可能會說,既然是擔心多執行緒併發問題,那我在子執行緒中加鎖進行更新UI行不行呢?你這樣想的話,會容易造成UI卡頓的,而且效能也不好。
注1:大部分面試者很難去說出一個令面試官滿意的答案。
注2:關於多執行緒,這裡舉一個例子,比如說銀行取款的問題。正常情況下,銀行卡餘額不能少於取款金額,如果多執行緒進行取款的話,就會造成執行緒不安全。
注3:Android中之所以說架構簡單,是因為幫我們封裝了很多更新UI的操作。
三、Handler的兩個異常:
在使用Handler時,經常會出現以下兩個異常:
(1)CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views:此異常是因為嘗試在子執行緒中去更新UI,進而報錯。
(2)Can’t create handle inside thread that ha not called Looper.prepared:是因為我們在子執行緒中去建立Handler,而產生的異常。
我們接下來透過程式碼來把這兩個異常演示一下。
1、子執行緒中更新UI的異常:
(1)activity_main.xml:
上方程式碼中,一個文字,一個按鈕,程式碼比較簡單。
(2)MainActivity.java:
上方程式碼中,核心程式碼是第45行:點選按鈕後,在子執行緒中更新UI。
我們來看一下後臺的log日誌:
上圖中報的錯誤日誌就是因為我們在子執行緒中去更新UI。
解決方案:
在子執行緒中建立Message訊息,透過Handler發給主執行緒,之後在Handler的handleMessage方法中獲得Message訊息,進而處理更新UI介面。程式碼如下:
上方第50行程式碼也可以換成51行程式碼:
2、在子執行緒中建立Handler的異常:
MainActivity.java:
執行程式後, 報錯如下:
非原創,參考自:http://blog.csdn.net/erliangcode/article/details/52117831
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2808262/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android 進階 ———— Handler系列之建立子執行緒HandlerAndroid執行緒
- 面試官:Java執行緒可以無限建立嗎?面試Java執行緒
- JAVA中執行緒的建立Java執行緒
- 小夥子,你懂執行緒池的建立嗎?執行緒
- 多執行緒中不用sleep(),行嗎?執行緒
- Handler怎麼進行執行緒通訊?Handler原理解讀執行緒
- 在子執行緒中建立新的窗體,遇到的問題。執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Android 子執行緒 UI 操作真的不可以?Android執行緒UI
- 執行緒的建立及執行緒池執行緒
- 如何在子執行緒中更新UI執行緒UI
- Android 多執行緒:你的 Handler 記憶體洩露 了嗎?Android執行緒記憶體洩露
- 執行緒池建立執行緒的過程執行緒
- 認識執行緒、建立執行緒寫法執行緒
- (MFC)子執行緒的資料如何傳遞給主執行緒中?執行緒
- 你都理解建立執行緒池的引數嗎?執行緒
- Java Profilers 可以用來監控執行緒池嗎Java執行緒
- QT 主執行緒子執行緒互相傳值QT執行緒
- performSelector:withObject:afterDelay: 在子執行緒中呼叫不執行performSelectorObject執行緒
- new Handler().postDelayed(new Runnable())是否執行在主執行緒?執行緒
- 在非主執行緒中建立視窗執行緒
- JAVA中執行緒建立的2種方法Java執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- 程式執行緒篇——執行緒切換(上)執行緒
- Java執行緒:執行緒中斷Java執行緒
- 可以在applet中執行MS Word嗎?APP
- Java中執行緒池,你真的會用嗎?Java執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- pyqt5 子執行緒如何操作主執行緒GUIQT執行緒GUI
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- MFC多執行緒的建立,包括工作執行緒和使用者介面執行緒執行緒
- 大話Android多執行緒(三) 執行緒間的通訊機制之HandlerAndroid執行緒
- 被問懵了:一個程式最多可以建立多少個執行緒?執行緒
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- jdk建立執行緒的方式JDK執行緒
- 執行緒池建立方式執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒