亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Android面試??虷andler詳解

難度中級
時長 2小時 0分
學習人數
綜合評分9.30
169人評價 查看評價
9.7 內容實用
9.3 簡潔易懂
8.9 邏輯清晰
  • 在ViewRootImpl沒有實例化的時候是不會check是否是主線程,也就是說,在非UI線程中是可以更新UI的,但是為了線程安全的原因,系統會強制要求只能在主線程中更新UI(猜測)。之所以說沒有太大的意義是因為實際開發中是不會有這種情況的,谷歌官方也是說了只能在UI線程更新UI,這頂多算是一個BUG吧,看不懂的朋友們知道就行了,不用深究~ 非UI線程能否更新UI --->剛啟動的時候,立即在非UI線程更新->不報錯。 --->休眠2s鐘以后,更新——————>報錯 更新UI-->會調用checkForRelayout()方法 -->invalidate()方法-->invalidate(true)方法,關注viewParent-->ViewRootImpl是ViewParent的實現類 --->p.invalidateChild()-->查看ViewRootImpl.invalidateChild()-->checkThread()方法-->判斷UI線程是否是當前線程,不想等拋出異常。 ViewRootImpl是onResume()方法才會創建。所以onCreate()方法中要延遲才可以。 handleResumeActivity()方法---》viewManager.addView()-->ViewRootImpl初始化。,關注viewParent-->ViewRootImpl是ViewParent的實現類 在非UI線程中是可以更新Ui的(在onCreate中創建新線程更新UI): 當剛啟動Activity即onCreate里面此時onResume方法還沒有執行的時候可以,因為在線程中更新UI時會調用ViewParent.invalidateChild()方法檢查當前的Thread是否是UIThread,若為UIThread則可以更新(ViewParent是一個接口類,其實現是ViewRootImpl;invalidateChild()方法調用checkThread()方法來檢查線程是否為主線程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl創建之前更新UI(在onCreate方法中創建線程并執行,此時還沒有初始化ViewRootImp),就可以逃避掉checkThread()的檢查進而更新UI。
    查看全部
  • 主要是在HandlerThread里面創建一個Looper,和默認的 handler 進行關聯。 所有的handlerMessage()都是在子線程中調用。 我們可以使用 HandlerThread 模擬異步任務的操作,只需要在主線程中給子線程發送消息,讓子線程做耗時操作。 總之,HandlerThread可以處理耗時操作,例如下載網絡圖片、更新數據庫等等,可以在完全不占用主線程的情況下處理比較耗時的操作。從設計的角度來看,是比較方便快捷的。 因為如果自己想要實現異步任務機制,就需要考慮一些問題,例如要開啟線程、往異步任務中添加任務,任務本身還要考慮存儲結構、什么時候添加任務、什么時候移除任務,以及任務如何傳遞、派發等等。比較麻煩。 而Android提供了HandlerThread方法,它是系統已經將任務的發送、處理等都封裝好了,使用起來比較方便,我們只需調用 HandlerThread。
    查看全部
  • Handler是什么? Handler是Android提供的一套用來更新UI的機制,也是一套消息處理機制,可以通過它發送消息,也可以通過它處理消息。 所有Activity生命周期回調的方法,都是通過handler機制去發送消息的,然后根據不同的消息(message)做相應的分支處理。例如發送一個消息給 Framework,告知需要調用onCreate()或onDestory()方法。實際上在 Framework 當中,Activity的交互大部分都是用AMS(Activity Manager Service)做處理的。整個應用程序的核心的一個類就是 Activity Thread,Activity Thread就是通過handler機制接收到 Activity Manager Service發送的有關Activity生命周期的管理的消息(比如啟動)。 為什么要使用Handler? Android在設計的時候,就封裝了一套消息的創建、傳遞、處理機制,如果不遵循這樣的機制,就沒有辦法更新UI信息,并且會拋出異常信息。這樣的機制便包含Handler機制。 我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的。這個時候,Handler就出現了。來解決這個復雜的問題 ,由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數據, 這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(里面包含數據),把這些消息放入主線程隊列中,配合主線程進行更新UI。 Handler主要接受子線程發送的數據,并用此數據配合主線程更新UI。 當應用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) ,主線程為管理界面中的UI控件,進行事件分發,比如說, 你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操作。如果此時需要一個耗時的操作,例如: 聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象,如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示 "強制關閉"。
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-03-22

  • handler是android提供的用于更新UI的一套機制,也是一套用于消息處理的機制,我們可以通過它來發送和處理消息
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-03-01

  • handler是android為我們提供的一套用于更新UI
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-03-01

  • Handler是什么?
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-01-06

  • handler handlerMessage接受信息的方法 發送信息要實現Message方法 Looper.mylooper獲取一個looper looper.Loop循環looper Handler 負責發送信息 Looper 負責接受handler發送過來的信息 MessageQueue 存儲信息的容器
    查看全部
  • 系統已為UI線程準備好了looper和msgqueue。 這時候用戶在UI線程創建了handler對象并不會報錯。 接著子線程里調用post或者send方法,實際上就是往UI線程的msgqueque對象里enqueque一條msg。 而UI線程的looper一直在loop,所以當msgqueque里新增了msg對象并觸發條件滿足后會調用msg里target的dispatchmsg方法。 實際上就是Handler父類的dispatchMsg方法。 緊接著handler父類再決定調用post過來的邏輯還是子類覆寫的handlemsg方法。
    查看全部
  • post 不用實現handlemsg 適用于簡單的處理邏輯的場合 使用場景較少 sendmsg 需要實現handlemsg 適用于需要傳遞線程間數據進行處理的場合 使用場景較多
    查看全部
  • handler,looper,messagequeue,message,thread.學習了解之間關系,知道函數及使用
    查看全部
    0 采集 收起 來源:課程內容介紹

    2017-11-28

  • handler
    查看全部
    0 采集 收起 來源:課程內容介紹

    2017-11-27

  • handler
    查看全部
    0 采集 收起 來源:課程內容介紹

    2017-11-11

  • handler、looper、messagequeue、message四者可以這樣理解: handler:工人; looper:傳送帶移動的動力; messagequeue:傳送帶; message:傳送帶上面的產品。 工人(handler)把自己的產品(message)放在傳送帶(messagequeue)尾部,在動力(looper)作用下,傳送帶向前移動,最終產品到達傳送帶頭部,被取出來處理(handmessage())。 ----------------- 先要有個概念。 1、handler 消息處理器,負責處理消息。 2、Message 消息,包含消息id,被處理的對象。 3、MessageQueue 消息隊列,存放Handler發送過來的Message 4、looper 消息泵,不間斷的從MessageQueue消息隊列中抽取消息。 簡單的比喻looper就是水泵,MessageQueue儲水的池塘,Message就是水,Handler就是操作的人。
    查看全部
  • 以下內容來自大神筆記: handler、looper、messagequeue、message四者可以這樣理解: handler:工人; looper:傳送帶移動的動力; messagequeue:傳送帶; message:傳送帶上面的產品。 工人(handler)把自己的產品(message)放在傳送帶(messagequeue)尾部,在動力(looper)作用下,傳送帶向前移動,最終產品到達傳送帶頭部,被取出來處理(handmessage())。 ----------------- 先要有個概念。 1、handler 消息處理器,負責處理消息。 2、Message 消息,包含消息id,被處理的對象。 3、MessageQueue 消息隊列,存放Handler發送過來的Message 4、looper 消息泵,不間斷的從MessageQueue消息隊列中抽取消息。 簡單的比喻looper就是水泵,MessageQueue儲水的池塘,Message就是水,Handler就是操作的人。
    查看全部
  • Handler的原理是什么? 面試經典問題:Looper、Handler、Message(或MessageQueue)三者間的關系? 一、Handler封裝了消息的發送(主要是將消息發送給誰(默認是Handler自己),以及什么時候發送)。 Looper: 1.內部包含一個消息隊列 MessageQueue,所有的 Handler 發送的消息都走向(加入)這個消息隊列。 2.Looper.Looper方法,就是一個死循環,不斷地從 MessageQueue 取得消息,如果有消息就處理消息,沒有消息就阻塞。 二、MessageQueue MessageQueue 就是一個消息隊列,可以添加消息,并處理消息。 三、Handler 也很簡單,內部會跟 Looper 進行關聯,也就是說,在 Handler 的內部可以找到 Looper,找到了 Looper 也就找到了 Message。在 Handler 中發送消息,其實就是向 MessageQueue 隊列中發送消息。 總結:Handler 負責發送消息,Looper 負責接收 Handler 發送的消息,并直接把消息回傳給 Handler 自己,MessageQueue就是一個存儲消息的容器。
    查看全部

舉報

0/150
提交
取消
老師告訴你能學到什么?
通過本課程,你將學到: 1、什么是Handler 2、如何使用Handler 3、Handler的原理是什么 4、如何定義一個與線程相關的Handler 5、Android更新UI的幾種方式 6、非UI線程真的不能更新UI嗎 7、Handler使用過程中遇到的問題

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!