欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

不知廬山真面目只緣身在此山中,講解一下Handler

o(╥﹏╥)o今天太困了,啥也不想干。就把之前收集的資料拿出來溫習(xí)一下剛好和大家共享下

新洲網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

不知廬山真面目只緣身在此山中,講解一下Handler

之前在" rel="nofollow">GitHub
上更新了些關(guān)于面試類的文章,含有從基礎(chǔ)到進階。含有BATJ.字節(jié)跳動面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識,到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記

(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)

Handler

1、談?wù)勏C制 Handler 作用 ?

負(fù)責(zé)跨線程通信,這是因為在主線程不能做耗時操作,而子線程不能更新 UI,所以當(dāng)子線程中進行耗時操作后需要更新 UI時,通過 Handler 將有關(guān) UI 的操作切換到主線程中執(zhí)行。

具體分為四大要素:

  • Message(消息):需要被傳遞的消息,消息分為硬件
    產(chǎn)生的消息(如按鈕、觸摸)和軟件生成的消息。
  • MessageQueue(消息隊列):負(fù)責(zé)消息的存儲與管
    理,負(fù)責(zé)管理由 Handler 發(fā)送過來的 Message。讀取
    會自動刪除消息,單鏈表維護,插入和刪除上有優(yōu)勢。
    在其 next()方法中會無限循環(huán),不斷判斷是否有消息,
    有就返回這條消息并移除。
  • Handler(消息處理器):負(fù)責(zé) Message 的發(fā)送及處
    理。主要向消息池發(fā)送各種消息事件
    Handler.sendMessage())和處理相應(yīng)消息事件
    Handler.handleMessage()),按照先進先出執(zhí)行,
    內(nèi)部使用的是單鏈表的結(jié)構(gòu)。
  • Looper(消息池):負(fù)責(zé)關(guān)聯(lián)線程以及消息的分發(fā),在
    該線程下從 MessageQueue 獲取 Message,分發(fā)給Handler,Looper 創(chuàng)建的時候會創(chuàng)建一個MessageQueue,調(diào)用 loop()方法的時候消息循環(huán)開始,其中會不斷調(diào)用 messageQueue 的 next()方法,當(dāng)有消息就處理,否則阻塞在 messageQueue 的next()方法中。當(dāng) Looperquit()被調(diào)用的時候會調(diào)用
    messageQueuequit(),此時 next()會返回 null,然
    loop()方法也就跟著退出。

具體流程如下:
不知廬山真面目只緣身在此山中,講解一下Handler

  • 在主線程創(chuàng)建的時候會創(chuàng)建一個 Looper,同時也會在在
    Looper 內(nèi)部創(chuàng)建一個消息隊列。而在創(chuàng)鍵 Handler 的
    時候取出當(dāng)前線程的 Looper,并通過該 Looper 對象獲
    得消息隊列,然后 Handler 在子線程中通過MessageQueue.enqueueMessage 在消息隊列中添
    加一條 Message
  • 通過 Looper.loop() 開啟消息循環(huán)不斷輪詢調(diào)用
    MessageQueue.next(),取得對應(yīng)的 Message 并且
    通過 Handler.dispatchMessage 傳遞給 Handler,最
    終調(diào)用 Handler.handlerMessage 處理消息。
2、一個線程能否創(chuàng)建多個 Handler,Handler 跟 Looper 之間的對應(yīng)關(guān)系 ?
  • 一個 Thread 只能有一個 Looper,一個 MessageQueen,可以有多個 Handler
  • 以一個線程為基準(zhǔn),他們的數(shù)量級關(guān)系是: Thread(1) :
    Looper(1) : MessageQueue(1) : Handler(N)
3、軟引用跟弱引用的區(qū)別
  • 軟引用(SoftReference):如果一個對象只具有軟引用,則
    內(nèi)存空間充足時,垃圾回收器就不會回收它;如果內(nèi)存空間不
    足了,就會回收這些對象的內(nèi)存。只要垃圾回收器沒有回收
    它,該對象就可以一直被程序使用。
  • 弱引用(WeakReference):如果一個對象只具有弱引用,那
    么在垃圾回收器線程掃描的過程中,一旦發(fā)現(xiàn)了只具有弱引用
    的對象,不管當(dāng)前內(nèi)存空間足夠與否,都會回收它的內(nèi)存。
  • 兩者之間根本區(qū)別在于:只具有弱引用的對象擁有更短暫的生
    命周期,可能隨時被回收。而只具有軟引用的對象只有當(dāng)內(nèi)存
    不夠的時候才被回收,在內(nèi)存足夠的時候,通常不被回收
    不知廬山真面目只緣身在此山中,講解一下Handler
4、Handler 引起的內(nèi)存泄露原因以及最佳解決方案

為什么會導(dǎo)致泄露:
Handler 允許我們發(fā)送延時消息,如果在延時期間用戶
關(guān)閉了 Activity,那么該 Activity 會泄露。 這個泄露
是因為 Message 會持有 Handler,而又因為 Java 的
特性,內(nèi)部類會持有外部類,使得 Activity 會被
Handler 持有,這樣最終就導(dǎo)致 Activity 泄露。

怎么解決:
將 Handler 定義成靜態(tài)的內(nèi)部類,在內(nèi)部持有
Activity 的弱引用,并在 AcitivityonDestroy()
調(diào)用 handler.removeCallbacksAndMessages(null)
及時移除所有消息。

5、為什么系統(tǒng)不建議在子線程訪問 UI?

Android 的 UI 控件不是線程安全的,如果在多線程中并發(fā)訪問
可能會導(dǎo)致 UI 控件處于不可預(yù)期的狀態(tài)

這時你可能會問為何系統(tǒng)不對 UI 控件的訪問加上鎖機制呢?因為:

  • 加鎖機制會讓 UI 訪問邏輯變的復(fù)雜
  • 加鎖機制會降低 UI 的訪問效率,因為加鎖會阻塞某些線
    程的執(zhí)行
    不知廬山真面目只緣身在此山中,講解一下Handler
    6、Looper 死循環(huán)為什么不會導(dǎo)致應(yīng)用卡死?
  • 主線程的主要方法就是消息循環(huán),一旦退出消息循環(huán),那么你的應(yīng)用也就退出了,Looer.loop()方法可能會引起主線程的阻塞,但只要它的消息循環(huán)沒有被阻塞,能一直處理事件就不
    會產(chǎn)生 ANR 異常。
  • 造成 ANR 的不是主線程阻塞,而是主線程的 Looper消息處理過程發(fā)生了任務(wù)阻塞,無法響應(yīng)手勢操作,不能及時刷新 UI。
  • 阻塞與程序無響應(yīng)沒有必然關(guān)系,雖然主線程在沒有消息可處理的時候是阻塞的,但是只要保證有消息的時候能夠立刻處
    理,程序是不會無響應(yīng)的。
7、使用 Handler 的 postDealy 后消息隊列會有什么變化?

如果隊列中只有這個消息,那么消息不會被發(fā)送,而是計算到
時喚醒的時間,先將 Looper 阻塞,到時間就喚醒它。但如果此時要加入新消息,該消息隊列的對頭跟 delay 時間相比更長,
則插入到頭部,按照觸發(fā)時間進行排序,隊頭的時間最小、隊
尾的時間最大

8丶子線程直接 new 一個 Handler 嗎?怎么做?

不可以,因為在主線程中,Activity 內(nèi)部包含一個 Looper 對
象,它會自動管理 Looper,處理子線程中發(fā)送過來的消息。而
對于子線程而言,沒有任何對象幫助我們維護 Looper 對象,所以需要我們自己手動維護。所以要在子線程開啟 Handler 要先
創(chuàng)建 Looper,并開啟 Looper 循環(huán)

9、Message 可以如何創(chuàng)建?哪種效果更好,為什么?

可以通過三種方法創(chuàng)建:

  • 直接生成實例 Message m = new Message
  • 通過 Message m = Message.obtain
  • 通過 Message m = mHandler.obtainMessage()

后兩者效果更好,因為 Android 默認(rèn)的消息池中消息數(shù)量是 10,而后
兩者是直接在消息池中取出一個 Message 實例,這樣做就可以避免多
生成 Message 實例。

請查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)

不知廬山真面目只緣身在此山中,講解一下Handler

網(wǎng)頁題目:不知廬山真面目只緣身在此山中,講解一下Handler
鏈接URL:http://chinadenli.net/article44/ihshee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站電子商務(wù)、外貿(mào)建站、品牌網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)