您好,登錄后才能下訂單哦!
這篇文章主要介紹Android開發中常見問題有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
(1) Service與Thread有什么區別?
(2) 在Activity里new Handler()和在自己創建的Thread中new Handler()有什么區別?
第一個問題其實是一個偽命令,因為Service是Android四大組件之一,而Thread只是Java提供的一個封裝了線程管理的工具類,無論是Activity還是Service,都可以通過Thread來創建一個工作線程,但是很多新手會搞不清楚它們之間的區別,借此可以試探一下面試者到底有沒有很清楚地理解Android的Service到底是做什么的。
第二個問題,涉及到Android開發必須掌握的知識點:Handler,本文就來從這個問題開始,說說我對Handler的理解。
當Android應用啟動后,系統會默認創建一個主線程(Main thread)。這個主線程啟動后,首先完成UI的繪制,然后會進入一個消息循環(Loop),等待和執行各種來自系統的消息和事件、各種用戶點擊/觸摸事件、其他線程發送的消息事件等等。這是線程工作的一種常見的模式,即進入一種“等待命令”->“執行命令/消息”->“等待命令/消息”的循環。
那么,其他非UI線程如何與進入了消息循環的主線程交互呢?這就得靠Handler了。
Handler是Android系統為工作線程提供的一種可以與外界交互的接口,通過Handler提供的sendMessage()方法,外界可以發送各種消息事件給工作線程。Handler通過構造函數完成與指定線程的綁定,其構造函數定義如下:
public Handler() { this(null, false); } public Handler(Looper looper) { this(looper, null, false); } public Handler(Looper looper, Callback callback) { this(looper, callback, false); } public interface Callback { public boolean handleMessage(Message msg); }
其中,Looper就是線程內部負責實現消息循環的對象,普通的Java.Thread線程內部是沒有這樣一個消息循環對象的,Android專門提供了HandlerThread封裝這種帶消息循環機制的線程。Handler通過與線程的Looper對象綁定,來完成與該Thread的綁定。
Callback則是由工作線程內部傳出接收到的消息的回調接口,其他線程通過Handler的sendMessage發送消息給工作線程后,工作線程就會通過Callback將接收到的消息通知給監聽者。
注意:默認情況下,如果new Handler()的時候,沒有傳入某個線程的Looper對象(或傳入null),系統就會默認綁定到創建Handler()對象的線程中。
那么,現在可以回答第二個問題了,在Activity里new Handler()和在自己創建的Thread中new Handler()有什么區別?
答案:
Activiy默認是工作在主線程中的,所以在Activity中new Handler()后,該Handler對象默認綁定了主線程的Looper對象,因此該Handler.sendMessage消息發送給了主線程,而且通過傳入Callback對象得到的handleMessage()回調也是工作在主線程,這就是為什么可以通過在Activity里使用如下方式更新UI而不會導致ANR了:
new Handler( new Handler.Callback() { @Override public boolean handleMessage(Message msg) { UpdateUI(); return false; } });
同理,如果在自定義線程中 new Handler(),則默認情況該Handler()綁定了該線程的Looper對象,因此該Handler.sendMessage消息則是發送給了這個線程,而且通過傳入Callback對象得到的handleMessage()回調也是工作在這個線程,因此,這種情況下的handleMessage()函數中就不能進行UI更新操作了,否則會導致ANR了。
以上是“Android開發中常見問題有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。