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

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

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()方法中要延遲才可以。 面試用:在非主線程是否可以更新UI 答:當剛啟動還沒有onResume的時候可以,即onCreate里面 ViewRootImp是在onResume方法中初始化的,在onCreate方法中創建線程并執行,此時還沒有初始化ViewRootImp
    查看全部
  • Android中更新UI的幾種方式: 1. public void activityUpdateUI(){ runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Changed by Activity"); } }); } 2. public void handlerChangeUI(){ handler.post(new Runnable(){ @Override public void run() { textView.setText("OK"); } }); } 3. public void handlerChangeUI2(){ handler.sendEmptyMessage(1); } 4. view.post() public void viewUpdateUI(){ textView.post(new Runnable() { @Override public void run() { textView.setText("UI was updated by view.post"); } }); } 通過源碼我們可以發現: handler使用post()去發送一個Runnable,其實它內部也是封裝了Message去發送的,本質上和直接發送Message沒有區別; runOnUiThread()方法會判斷當前線程是不是UI線程,不是的話,則調用Activity自己的Handler對象,通過該對象發送一個Runnable;如果是,則調用UI線程的run()方法。 View的post()方法會判斷 attachInfo 是否為空。如果不為空,則通過 attachInfo 的Handler對象去post一個Runnable對象。如果為空,則調用ViewRootImpl的getRunQueue去拿到一個Handler去post一個Runnable對象。 綜上,更新UI的四種方法,本質上都是通過Handler機制去更新UI的。
    查看全部
  • 主線程和子線程之間的交互的實現 本例的思路: 1. 在主線程中創建兩個Handler對象 handler 和 handler2(圖中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 創建一個子線程 thread ,并啟動 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作為參數),這樣一來handler2就是子線程的 Handler 對象。 4. 重寫 handler 和 handler2 的 handleMessage()方法,在里面創建Message對象,并使用對方的sendMessageDelayed(message,1000);方法發送消息。 5. 定義一個Button,定義點擊事件,由點擊事件觸發如上交互的操作。 如上操作中,第4點是核心,也就是兩個 Handler 各自重寫 handleMessage(),方法里面卻是使用對方的 sendMessage() 方法。這樣就實現了主線程和子線程的相互發送信息。 -------------- 摘自評論區,親測有效: 取消發送,經測試,需要將UIhandler 和 threadhandler中的message的what 設置為1,取消的時候要同時removeMessage(1); 1. 子線程向主線程發送消息,必須有主線程的Handler,該Handler綁定了主線程的Looper。 2. 主線程向子線程發送消息,必須有子線程的Looper,為了防止Looper沒有初始化,所以通過HandlerThread類,來保證子線程的Looper再被主線程調用時已經初始化。
    查看全部
  • HandlerThread 解決了多線程并發導致空指針的問題 為什么Handler需要和Looper關聯,是因為Handler需要往Looper中的mQeueu里插入Message。所以,如果主線程需要和子線程之間通信,那有兩個方法:<br> 1. 主線程擁有子線程的Handler(注意:子線程的Handler需要關聯自己的Looper),通過該Handler發送消息即可。<br> 2. 主線程創建一個Handler,但是將子線程的Looper傳遞給Hander,這樣Handler也是往子線程Looper對象的mQueue里插入msg,子線程Looper.loop自然可以拿到主線程消息了。<br> <br> 但是,這兩種情況都有弊端。就是線程并發的時候,不能保證子線程的Handler或者Looper對象已經被初始化了。所以這個時候才需要用到HandlerThread 我們可以使用 HandlerThread 模擬異步任務的操作,只需要在主線程中給子線程發送消息,讓子線程做耗時操作。 總之,HandlerThread可以處理耗時操作,例如下載網絡圖片、更新數據庫等等,可以在完全不占用主線程的情況下處理比較耗時的操作。從設計的角度來看,是比較方便快捷的。 因為如果自己想要實現異步任務機制,就需要考慮一些問題,例如要開啟線程、往異步任務中添加任務,任務本身還要考慮存儲結構、什么時候添加任務、什么時候移除任務,以及任務如何傳遞、派發等等。比較麻煩。 而Android提供了HandlerThread方法,它是系統已經將任務的發送、處理等都封裝好了,使用起來比較方便,我們只需調用 HandlerThread。
    查看全部
  • 如圖,分別在主線程和自定義的子線程中創建 Handler 。在各自的 handlerMessage()方法中打印當前線程的id。Handler和線程是相關聯的。 要在線程中創建一個 Handler,需要先創建 Looper ,創建的方法很簡單:Looper.prepare(); 之后就可以創建 Handler 了。在創建 Handler 之后別忘了調用 Looper.loop(); 這樣才能實現對消息的循環處理。 再次強調:不可以在主線程中做耗時操作,就比如示例里面主線程中的 handlerMessage(),不能執行耗時操作。 我們一般是在主線程中創建Handler對象,在主線程中處理Message,在子線程中調用這個Handler對象的sendMessage()來發送message。所以Handler是在哪個線程創建就有哪個線程處理Message和輪詢,而由別的線程負責給這個Handler發送Message。 * 每個線程都對應一個looper,在線程里面創建的handler默認都會與這個looper對應 * 一個線程可以有多個handler與唯一的一個looper對應,有且只有一個looper * 這里主要是讓我們熟悉在oncreat創建的handler與子線程創建handler * oncreate創建的handler他默認里面會有一個looper與之對應 * 所以我們自己在子線程中創建handler對象的時候我們應該要自主創建一個looper ---摘自大神
    查看全部
  • Handler原理的圖解。 員工(Handler)要上廁所,需要和領導知會一下(sendMessage),領導(Looper)反饋消息( Looper.loop() )后,“上廁所”這件事還是由員工自己去解決(handleMessage)。 Looper僅僅起了傳達消息的作用,而消息的發送和處理都還是由Handler自己去做。
    查看全部
  • 大神筆記: handler:工人; looper:傳送帶移動的動力; messagequeue:傳送帶; message:傳送帶上面的產品。 工人(handler)把自己的產品(message)放在傳送帶(messagequeue)尾部,在動力(looper)作用下,傳送帶向前移動,最終產品到達傳送帶頭部,被取出來處理(handmessage())。
    查看全部
  • Android設計用handler機制更新UI解決了多線程并發問題。 在一個Activity中,有多個線程更新UI,并且都沒有加鎖機制,會導致更新界面錯亂; 如果更新UI操作都進行加鎖處理,則會導致性能下降。 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就是一個存儲消息的容器。
    查看全部
  • Message message=handler.obtainMessage();//從Handler對象中獲取Message對象,而不是自己new,這樣效率高。 message.sendToTarget(); //對于從handler對象中獲取的message,可以直接使用該方法發送消息。 知識拓展: 1。實例化Handler時,可以使用帶一個Callback接口參數的構造函數。 其中Callback有一個未實現的方法。 這個方法有一個返回值(boolean) 2.當該Handler收到消息時,首先會調用Callback中的消息處理方法。 2.1 如果返回值為false,消息不會被截斷。Handler依然可以處理該消息。 2.2 如果返回值為true,消息將會被截斷。Handler中的處理消息方法不會被執行。
    查看全部
  • There are some main methords to schedule messages: post(Runnable) postAtTime(Runnable, long) postDelayed(Runnable, long) sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message, long) sendMessageDelayed(Message, long)
    查看全部
  • A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it . From that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue. There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; (2) to enqueue an action to be performed on a different thread than your own. When a process is created for your application, its main thread is dedicated to running a message queue that takes care of managing the top-level application objects (activities, broadcast receivers, etc) and any windows they create.
    查看全部
  • handler 是什么? 是Android提供給我們更新ui的一套機制,也是一套消息機制,我們可以發送消息,也可以通過它處理消息。 不用handler可以嗎? Android在設計的時候封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制,就會拋出異常
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-03-19

  • 為什么使用handler
    查看全部
    0 采集 收起 來源:Handler是什么

    2018-03-15

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

    2018-03-15

  • 創建子線程的handler
    查看全部

舉報

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

微信掃碼,參與3人拼團

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

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