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

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

Android面試??虷andler詳解

難度中級
時長 2小時 0分
學習人數
綜合評分9.30
169人評價 查看評價
9.7 內容實用
9.3 簡潔易懂
8.9 邏輯清晰
  • 如圖藍色選中區域,主線程的 handler 使用其他線程的 looper,運行時會報出空指針異常,程序崩潰。 為什么呢?這涉及到多線程并發問題。當主線程已經運行到圖示藍色選中區域時,可能其他線程(這里是thread線程)還沒有創建或者初始化 looper。于是就造成了空指針異常。 如何解決多線程導致的空指針問題? 使用HandlerThread。
    查看全部
  • 如圖,分別在主線程和自定義的子線程中創建 Handler 。在各自的 handlerMessage()方法中打印當前線程的id。 Handler和線程是相關聯的。 再次強調:不可以在主線程中做耗時操作,就比如示例里面主線程中的 handlerMessage(),不能執行耗時操作。 創建一個與自定義線程相關的Handler的代碼: class MyThread extends Thread{ public Handler handler; @Override public void run() { Looper.prepare(); // 創建Looper,默認情況是根據當前線程去拿到Looper handler = new Handler(){ // 與子線程相關的Handler @Override public void handleMessage(Message msg) { System.out.printf("currentThread:"+Thread.currentThread()); // 打印當前線程的id } }; Looper.loop(); // 調用該方法實現對消息的循環處理 } } 要在線程中創建一個 Handler,需要先創建 Looper ,創建的方法很簡單:Looper.prepare(); 之后就可以創建 Handler 了。在創建 Handler 之后別忘了調用 Looper.loop(); 這樣才能實現對消息的循環處理。 摘自評論區: 推薦博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
    查看全部
  • Handler原理的圖解。 員工(Handler)要上廁所,需要和領導知會一下(sendMessage),領導(Looper)反饋消息( Looper.loop() )后,“上廁所”這件事還是由員工自己去解決(handleMessage)。 Looper僅僅起了傳達消息的作用,而消息的發送和處理都還是由Handler自己去做。 ------------- 摘自評論區: MessageQueue在這里就是領導的腦子啊,如果有五個人ABCDE同時要上廁所它就會把這五個人記在腦子里并依次處理這五個人能否上廁所,比如A沒什么事就讓他去,B負責等待客戶緊急電話他就不能去,并依次各自回傳給ABCDE(handleMessage)。
    查看全部
  • 摘自評論區: 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對象的方法 sendEmptyMessage(int what)會回調 sendEmptyMessageDelayed(what,0)方法: public final boolean sendEmptyMessageDelayed(int what,long delayMillis){ Message msg = Message.obtain(); msg.what = what; return sendMessageDelayed(msg,delayMillis); } 方法內部回調了如下方法: public final boolean sendMessageDelayed(Message msg,long delayMillis){ if(delayMillis < 0){ delayMillis = 0; } return sendMessageAtTime(msg,SystemClock.uptimeMillis() + delayMillis); } 方法內部回調了如下方法: public boolean sendMessageAtTime(Message msg,long uptimeMillis){ boolean sent = false; MessageQueue queue = mQueue; // 通過當前線程獲得消息隊列 if(queue!=null){ msg.target = this; // 發送的對象是Handler自己 sent = queue.enqueueMessage(msg, uptimeMillis); // 將消息放入消息隊列 } else{ RuntimeException e = new RuntimeException( this + "sendMessageAtTime()called with no mQueue"); Log.w("Looper",e.getMessage(),e); } return sent; } 如上的種種方法揭示了Handler和MessageQueue的部分關系。
    查看全部
  • threadlocal 作用:在線程中保存一些變量信息。創建和線程相關的對象(變量)。主要有兩個方法:set和get,set將變量放入threadlocal,get則是從 threadlocal 中取出變量。 -------------- 消息隊列如何輪詢呢?整個“輪詢”是通過Looper.Looper來實現的,其核心代碼是一個for(;;)的死循環。 -------------- Handler的dispatchMessage()的源碼: public void dispatchMessage(Message msg){ if(msg.callback != null){ handleCallack(msg); }else{ if(mCallback!=null){ if(mCallback.handMessage(msg)){ return; } } handleMessage(msg); // Handler自身的handlerMessage()方法。 } } 其中,mCallback就是我們在創建Handler對象的時候傳入的Callback()參數,如果它不為空,就判斷它的 handlerMessage()返回的布爾變量,如果是true就直接retuen,不再執行 Handler本身的handlerMessage() 方法,這就是所謂的“攔截”消息。 從上述可以看出,Handler是通過 dispatchMessage() 去調用 handleMessage(),這就是為什么 Handler 在發送 Message 的時候會回調 handleMessage()方法。 之前有總結過:Handler 負責發送消息,Looper 負責接收 Handler 發送的消息,并直接把消息回傳給 Handler 自己,MessageQueue就是一個存儲消息的容器。 那么,如何回傳?調用Looper.Looper,判斷target是誰,默認就是Handler自己,調用Handler自己的dispatchMessage()方法去回調自己的 handleMessage()方法。這就是回傳。
    查看全部
  • Android為什么要設計只能通過Handler機制更新UI呢? 最根本的目的就是解決多線程并發的問題。 1. 假如在一個Activity當中,有多個線程去更新UI,并且都沒有加鎖機制,那么會產生什么樣子的問題? --> 更新界面混亂。 2. 如果對更新UI的操作都進行加鎖處理的話又會產生什么樣子的問題? --> 性能下降。 正是對以上問題的考慮,Android給我們提供了一套更新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就是一個存儲消息的容器。
    查看全部
  • Callback()和 Handler()一樣,都有handleMessage(Message message)方法,不同的是前者是有返回值的。 使用Callback()攔截消息: 在 Handler 發送消息的過程中,我們是可以去截獲這個消息。要怎么去截獲呢?在創建Handler對象的時候我們需要傳入一個參數,也就是 new 一個 Callback 對象,在 Callback 對象當中就可以截獲 Handler 發送過來的消息: Callback內部的方法 handlerMessage()默認返回一個 false,如果改成 true,就會截獲消息,也就是說,Handler內部的方法 handlerMessage()將不會被執行。
    查看全部
  • 我們可以自定義一個Message對象,然后通過Handler去發送這個對象。但我們也可以直接復用系統的Message對象。 通過Handler對象的obtainMessage()去復用系統的Message(內部原理:系統會優先返回空的Message,如果沒有,則創建一個Message): Message message = handler.obtainMessage(); 然后,可以使用該 message 的 sendToTarge()方法將信息發送出去,而不用通過Handler對象的sendMessage(message)方法。 查看 sendToTarget()源碼: public void sendToTarget(){ target.sendMessage(this); } 其中“target”就是Handler自己。實際上就是調用Handler自己的sendMessage()方法。本質上和普通的發送消息( handler.sendMessage(message) )是一樣的。 -------------- 消息的移除 handler.removeCallbacks(myRunnable);
    查看全部
  • Handler的示例,實現圖片輪播。 代碼實現 1. 在主布局中定義一個ImageView控件。 2. 在 MainActivity 中創建并初始化ImageView,定義一個圖片數組 images 和數組下標索引 index,創建一個Handler對象。 3. 創建一個內部類 MyRunnable 實現 Runnable 接口,重寫 run() 方法: public void run() { index++; index = index%3; // 圖片輪播(一般是通過ViewPager實現圖片輪播) imageView.setImageResource(images[index]); handler.postDelayed(myRunnable,1000); // 每隔一秒換一次圖片 } 4. 在onCreste()方法中調用handler,也就是在主線程中調用handler: handler.postDelayed(myRunnable,1000);
    查看全部
  • #摘自Hongyang的博客 1、首先Looper.prepare()在本線程中保存一個Looper實例,然后該實例中保存一個MessageQueue對象;因為Looper.prepare()在一個線程中只能調用一次,所以MessageQueue在一個線程中只會存在一個。 2、Looper.loop()會讓當前線程進入一個無限循環,不端從MessageQueue的實例中讀取消息,然后回調msg.target.dispatchMessage(msg)方法。 3、Handler的構造方法,會首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關聯。 4、Handler的sendMessage方法,會給msg的target賦值為handler自身,然后加入MessageQueue中。 5、在構造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調用的方法。 好了,總結完成,大家可能還會問,那么在Activity中,我們并沒有顯示的調用Looper.prepare()和Looper.loop()方法,為啥Handler可以成功創建呢,這是因為在Activity的啟動代碼中,已經在當前UI線程調用了Looper.prepare()和Looper.loop()方法。
    查看全部
  • 1. 我們要創建一個handler的時候,它會和默認的一個線程進行綁定,而這個默認的線程當中就有一個MessageQueue(消息隊列)。 2. handler的兩個用途:(1)定時發送一個Messages或者Runnables對象;(2)可以在一個線程當中去處理并執行一個Action的動作。 3. 主線程運行一個消息隊列,并管理著一些頂級的應用對象(top-level application objects),包括Activity、Broadcast Receiver等等,這些對象默認都是創建在Activity Thread(也就是我們常說的UI線程或者主線程)當中。
    查看全部
  • 以下摘自評論區: 我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到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是什么? Handler是Android提供的一套用來更新UI的機制,也是一套消息處理機制,可以通過它發送消息,也可以通過它處理消息。 所有Activity生命周期回調的方法(例如onCreate()、onDestory()等等),都是通過handler機制去發送消息的,然后根據不同的消息(message)做相應的分支處理。例如發送一個消息給 Framework,告知需要調用onCreate()或onDestory()方法。實際上在 Framework 當中,Activity的交互大部分都是用AMS(Activity Manager Service)做處理的。整個應用程序的核心的一個類就是 Activity Thread,Activity Thread就是通過handler機制接收到 Activity Manager Service發送的有關Activity生命周期的管理的消息(比如啟動)。 為什么要使用Handler? Android在設計的時候,就封裝了一套消息的創建、傳遞、處理機制,如果不遵循這樣的機制,就沒有辦法更新UI信息,并且會拋出異常信息。這樣的機制便包含Handler機制。
    查看全部
    0 采集 收起 來源:Handler是什么

    2017-03-29

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

    2017-03-29

舉報

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

微信掃碼,參與3人拼團

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

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