第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Android面試??虷andler詳解

難度中級
時長 2小時 0分
學(xué)習(xí)人數(shù)
綜合評分9.30
169人評價 查看評價
9.7 內(nèi)容實(shí)用
9.3 簡潔易懂
8.9 邏輯清晰
  • Handler原理的圖解。 員工(Handler)要上廁所,需要和領(lǐng)導(dǎo)知會一下(sendMessage),領(lǐng)導(dǎo)(Looper)反饋消息( Looper.loop() )后,“上廁所”這件事還是由員工自己去解決(handleMessage)。 Looper僅僅起了傳達(dá)消息的作用,而消息的發(fā)送和處理都還是由Handler自己去做。 ------------- 摘自大神筆記: MessageQueue在這里就是領(lǐng)導(dǎo)的腦子啊,如果有五個人ABCDE同時要上廁所它就會把這五個人記在腦子里并依次處理這五個人能否上廁所,比如A沒什么事就讓他去,B負(fù)責(zé)等待客戶緊急電話他就不能去,并依次各自回傳給ABCDE(handleMessage)。
    查看全部
  • 以下內(nèi)容來自大神筆記: handler、looper、messagequeue、message四者可以這樣理解: handler:工人; looper:傳送帶移動的動力; messagequeue:傳送帶; message:傳送帶上面的產(chǎn)品。 工人(handler)把自己的產(chǎn)品(message)放在傳送帶(messagequeue)尾部,在動力(looper)作用下,傳送帶向前移動,最終產(chǎn)品到達(dá)傳送帶頭部,被取出來處理(handmessage())。 ----------------- 先要有個概念。 1、handler 消息處理器,負(fù)責(zé)處理消息。 2、Message 消息,包含消息id,被處理的對象。 3、MessageQueue 消息隊(duì)列,存放Handler發(fā)送過來的Message 4、looper 消息泵,不間斷的從MessageQueue消息隊(duì)列中抽取消息。 簡單的比喻looper就是水泵,MessageQueue儲水的池塘,Message就是水,Handler就是操作的人。
    查看全部
  • Handler的原理是什么? 面試經(jīng)典問題:Looper、Handler、Message(或MessageQueue)三者間的關(guān)系? 一、Handler封裝了消息的發(fā)送(主要是將消息發(fā)送給誰(默認(rèn)是Handler自己),以及什么時候發(fā)送)。 Looper: 1.內(nèi)部包含一個消息隊(duì)列 MessageQueue,所有的 Handler 發(fā)送的消息都走向(加入)這個消息隊(duì)列。 2.Looper.Looper方法,就是一個死循環(huán),不斷地從 MessageQueue 取得消息,如果有消息就處理消息,沒有消息就阻塞。 二、MessageQueue MessageQueue 就是一個消息隊(duì)列,可以添加消息,并處理消息。 三、Handler 也很簡單,內(nèi)部會跟 Looper 進(jìn)行關(guān)聯(lián),也就是說,在 Handler 的內(nèi)部可以找到 Looper,找到了 Looper 也就找到了 Message。在 Handler 中發(fā)送消息,其實(shí)就是向 MessageQueue 隊(duì)列中發(fā)送消息。 總結(jié):Handler 負(fù)責(zé)發(fā)送消息,Looper 負(fù)責(zé)接收 Handler 發(fā)送的消息,并直接把消息回傳給 Handler 自己,MessageQueue就是一個存儲消息的容器。
    查看全部
  • 1)postDelayed(Runnable r, long delayMillis)延時delayMillis毫秒 將Runnable插入消息列隊(duì),Runnable將在handle綁定的線程中運(yùn)行。 2)第一個postDelayed方法里面的runnable對象是main上面MyRunnable類線程的對象,main里面的handler.postDelayed調(diào)用之后不斷的在線程中調(diào)用自身,從而實(shí)現(xiàn)輪播。
    查看全部
  • handler是Android給我們提供用來更新UI的一套機(jī)制,也是一套消息處理的機(jī)制,我們可以發(fā)送消息,也可以通過它處理消息 Android在設(shè)計(jì)的時候,就封裝了一套消息創(chuàng)建、傳遞、處理機(jī)制,如果不遵循這樣的機(jī)制,就沒有辦法更新UI信息,就會拋出異常。
    查看全部
    0 采集 收起 來源:Handler是什么

    2017-04-15

  • Handler簡介
    查看全部
  • 1)postDelayed(Runnable r, long delayMillis)延時delayMillis毫秒 將Runnable插入消息列隊(duì),Runnable將在handle綁定的線程中運(yùn)行。 2)第一個postDelayed方法里面的runnable對象是main上面MyRunnable類線程的對象,main里面的handler.postDelayed調(diào)用之后不斷的在線程中調(diào)用自身,從而實(shí)現(xiàn)輪播。
    查看全部
  • 關(guān)于第二個異常的舉例: new Thread(){ @Override public void run() { Handler handler = new Handler(); } } 運(yùn)行時就會拋出異常“Can't create handler inside thread that has not called Looper.prepare()”。 如圖,查看Handler()的源代碼。Looper.myLooper()是從當(dāng)前線程中取出 Looper對象,但如果我們之前并沒有在該線程中創(chuàng)建 Looper 對象( Looper.prepare() )的話,myLooper 就是空的,那么 mLooper 便也是空的,然后就報(bào)錯了。 Looper.myLooper():通過 TreadLocal 去拿出與當(dāng)前線程相關(guān)聯(lián)的 Looper 對象。
    查看全部
  • 使用handler時候常遇到的問題(系統(tǒng)拋出的異常): 1. android.view.ViewRootImpl$CalledFromWrongTreadException:Only the original thread that created a view hierarchy can touch its views 2. Can't create handler inside thread that has not called Looper.prepare() 在子線程中創(chuàng)建一個 Handler對象,卻沒有給它指定一個Looper對象的時候,就會拋出該異常。 如圖是第一個異常拋出的原因:checkThread()判斷“當(dāng)前線程(更新UI的線程)是不是主線程”,如果不是,就拋出該異常。
    查看全部
  • 如圖,真正判斷當(dāng)前線程是否在UI線程進(jìn)行更新操作的核心代碼就是圖中的藍(lán)色部分。 通過 ViewParent對象的 invalidateChild()方法做出判斷。 ViewParent 是 ViewRootImpl 的實(shí)現(xiàn)類。 ViewRootImpl 主要用于更新 UI 的判斷處理邏輯。它的初始化是在Activity的onResume()方法中進(jìn)行。 我們做了個小例子:在子線程中更新TextViwe,也就是更新UI: new Thread(){ @Override public void run() { textView.setText("在非主線程中更新UI"); } }.start(); 會發(fā)現(xiàn)系統(tǒng)并不會報(bào)錯,原因是 ViewParent 對象的 invalidateChild()方法還沒來得及做出判斷!為什么來不及? 因?yàn)椤皺z查當(dāng)前線程是否是主線程”的操作是在onResume()方法中,該方法在onCreate()之后調(diào)用,所以存在極為短暫的時間是無法做出檢查的,就在這段時間內(nèi)通過非主線程更新UI,系統(tǒng)也無法報(bào)錯。 雖然可以在非主線程中更新 UI ,但是不建議這么做,因?yàn)檫@樣的做法是有隱患的。 --------------- 摘自評論區(qū): 在ViewRootImpl沒有實(shí)例化的時候是不會check是否是主線程,也就是說,在非UI線程中是可以更新UI的,但是為了線程安全的原因,系統(tǒng)會強(qiáng)制要求只能在主線程中更新UI(猜測)。之所以說沒有太大的意義是因?yàn)閷?shí)際開發(fā)中是不會有這種情況的,谷歌官方也是說了只能在UI線程更新UI,這頂多算是一個BUG吧。 回調(diào)的路徑: text.setText()-->checkForRelayout()-->invalidate()-->ViewParent.invalidateChild()-->invalidateChildInParent()-->checkThread()
    查看全部
  • 代碼實(shí)現(xiàn): 1.使用Handler的post(): public void handlerChangeUI(){ handler.post(new Runnable(){ @Override public void run() { textView.setText("OK"); } }); } 2. 使用Handler的sendMessage(): public void handlerChangeUI2(){ handler.sendEmptyMessage(1); } 3. 使用Activity的runOnUiThread(): public void activityUpdateUI(){ runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Changed by Activity"); } }); } 4. 使用View的 post(): public void viewUpdateUI(){ textView.post(new Runnable() { @Override public void run() { textView.setText("UI was updated by view.post"); } }); } 最后在 onCreate()內(nèi)部創(chuàng)建一個線程,依次調(diào)用如上四種方法,觀察結(jié)果。 new Thread(){ @Override public void run() { try { Thread.sleep(1000); // handlerChangeUI(); // handlerChangeUI2() // activityUpdateUI() viewUpdateUI(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start();
    查看全部
  • 最后,看一下View的post()方法。 public boolean post(Runnable action){ final AttachInfo attachInfo = mAttachInfo; if(attachInfo != null){ return attachInfo.mHandler.poat(action); } ViewRootImpl.getRunQueue().post(action); return true; } 首先判斷 attachInfo 是否為空。如果不為空,則通過 attachInfo 的Handler對象去post一個Runnable對象。如果為空,則調(diào)用ViewRootImpl的getRunQueue去拿到一個Handler去post一個Runnable對象。其中,ViewRootImpl 和更新UI的機(jī)制有著密切相關(guān)的聯(lián)系。 綜上,更新UI的四種方法,本質(zhì)上都是通過Handler機(jī)制去更新UI的。
    查看全部
  • Android中更新UI的幾種方式: 1. Activity 的 runOnUiThread() 2. Handler 的 post() 3. Handler 的 sendMessage() 4. View 的 post() 查看源碼可發(fā)現(xiàn),handler的post()內(nèi)部調(diào)用了 sendMessageDelayed()方法,和我們普通發(fā)送Message是一樣的,只不過它還要先調(diào)用getPostMessage()方法: public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r),0); } private static Message getPostMessage(Runnable r){ Message m = Message.obtain(); m.callback = r; ruturn m; } 原來Callback就是一個Runnable對象。 總之,handler使用post()去發(fā)送一個Runnable,其實(shí)它內(nèi)部也是封裝了Message去發(fā)送的,本質(zhì)上和直接發(fā)送Message沒有區(qū)別。 那么Activity的runOnUiThread()又是如何更新UI的呢? public final void runOnUiThread(Runnable action){ if(Thread.currentThraed()!= mUiThread){ mHandler.post(action); // mHandler是Activity自己的Handler對象 }else{ action.run(); } } 首先,判斷當(dāng)前線程是不是UI線程,不是的話,則調(diào)用Activity自己的Handler對象,通過該對象發(fā)送一個Runnable;如果是,則調(diào)用UI線程的run()方法。 所以,Activity的runOnUiThread()內(nèi)部也是使用了Handler機(jī)制去更新UI。
    查看全部
  • 主線程和子線程之間的交互的實(shí)現(xiàn) 本例的思路: 1. 在主線程中創(chuàng)建兩個Handler對象 handler 和 handler2(圖中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 創(chuàng)建一個子線程 thread ,并啟動 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作為參數(shù)),這樣一來handler2就是子線程的 Handler 對象。 4. 重寫 handler 和 handler2 的 handleMessage()方法,在里面創(chuàng)建Message對象,并使用對方的sendMessageDelayed(message,1000);方法發(fā)送消息。 5. 定義一個Button,定義點(diǎn)擊事件,由點(diǎn)擊事件觸發(fā)如上交互的操作。 如上操作中,第4點(diǎn)是核心,也就是兩個 Handler 各自重寫 handleMessage(),方法里面卻是使用對方的 sendMessage() 方法。這樣就實(shí)現(xiàn)了主線程和子線程的相互發(fā)送信息。 -------------- 摘自評論區(qū),親測有效: 取消發(fā)送,經(jīng)測試,需要將UIhandler 和 threadhandler中的message的what 設(shè)置為1,取消的時候要同時removeMessage(1);
    查看全部
  • HandlerThread對象的方法 getLooper()首先會判斷線程是否活著,如果活著,并且默認(rèn)的 Looper 對象 mLooper 等于null,就讓當(dāng)前線程處于等待的狀態(tài)( wait() )。 那么,處于等待狀態(tài)的線程,什么時候被喚醒呢?可以去查看 HandlerThread 的 run()方法,畢竟 HandlerThread 是一個Thread類: public void run(){ mTid = Process.myTid(); Looper.prepare(); // 先調(diào)用該方法創(chuàng)建Looper對象。 synchronized(this){ mLooper = Looper.myLooer(); // 將Looper對象賦值給 mLooper,沒錯,也是getLooper()的mLooper。 notifyAll(); // 喚醒線程,Handler對象就可以拿到Looper對象,也就不會報(bào)出空指針的問題。 } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } --------------- 主要是在HandlerThread里面創(chuàng)建一個Looper,和默認(rèn)的 handler 進(jìn)行關(guān)聯(lián)。所有的handlerMessage()都是在子線程中調(diào)用。我們可以使用 HandlerThread 模擬異步任務(wù)的操作,只需要在主線程中給子線程發(fā)送消息,讓子線程做耗時操作??傊琀andlerThread可以處理耗時操作,例如下載網(wǎng)絡(luò)圖片、更新數(shù)據(jù)庫等等,可以在完全不占用主線程的情況下處理比較耗時的操作。從設(shè)計(jì)的角度來看,是比較方便快捷的。 因?yàn)槿绻约合胍獙?shí)現(xiàn)異步任務(wù)機(jī)制,就需要考慮一些問題,例如要開啟線程、往異步任務(wù)中添加任務(wù),任務(wù)本身還要考慮存儲結(jié)構(gòu)、什么時候添加任務(wù)、什么時候移除任務(wù),以及任務(wù)如何傳遞、派發(fā)等等。比較麻煩。 而Android提供了HandlerThread方法,它是系統(tǒng)已經(jīng)將任務(wù)的發(fā)送、處理等都封裝好了,使用起來比較方便,我們只需調(diào)用 HandlerThread。
    查看全部

舉報(bào)

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

微信掃碼,參與3人拼團(tuán)

微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復(fù)購買,感謝您對慕課網(wǎng)的支持!