Android 面試題之線程間通信機(jī)制

為什么一定要在主線程中創(chuàng)建AsyncTask的對(duì)象呢?

深入理解AsyncTask

為什么一定要在主線程中創(chuàng)建AsyncTask的對(duì)象呢?

  • 1.第一次加載的 AsyncTask 這個(gè)類的時(shí)候會(huì)創(chuàng)建 InternalHandler() 這個(gè)對(duì)象,這個(gè)是 Handler對(duì)象的子類, 只重寫了handleMessage() 方法;
  • 2.當(dāng)我們使用無(wú)參構(gòu)造函數(shù)創(chuàng)建 Handler 對(duì)象的時(shí)候取的 Looper 對(duì)象是當(dāng)前線程的, 因?yàn)檫@個(gè) InternalHandler() 對(duì)象是 AsynTask 的工作線程和主線程進(jìn)行通信的因此 AsyncTask 需要在主線程中創(chuàng)建。

真的一定要在主線程才可以創(chuàng)建AsyncTask嗎?

  • 1.Android 4.1版本之前,AsyncTask類必須在主線程中加載,這意味著對(duì)AsyncTask類的第一次訪問(wèn)必須發(fā)生在主線程中;
  • 2.在Android 4.1以及以上版本則不存在這一限制,因?yàn)锳ctivityThread的main方法中會(huì)自動(dòng)加載AsyncTask。

綜上,4.1后可以在子線程創(chuàng)建asynTask,但不推薦這么做,因?yàn)槿菀准哟蟪绦驈?fù)雜度,更容易產(chǎn)生bug,而且如果在onpostExecute中需要更新UI時(shí)仍然要切換到主線程。

關(guān)于Handle方面

3.1 介紹Handle的機(jī)制

  • Handler通過(guò)調(diào)用sendmessage方法把消息放在消息隊(duì)列MessageQueue中,Looper負(fù)責(zé)把消息從消息隊(duì)列中取出來(lái),重新再交給Handler進(jìn)行處理,三者形成一個(gè)循環(huán)
  • 通過(guò)構(gòu)建一個(gè)消息隊(duì)列,把所有的Message進(jìn)行統(tǒng)一的管理,當(dāng)Message不用了,并不作為垃圾回收,而是放入消息隊(duì)列中,供下次handler創(chuàng)建消息時(shí)候使用,提高了消息對(duì)象的復(fù)用,減少系統(tǒng)垃圾回收的次數(shù)
  • 每一個(gè)線程,都會(huì)單獨(dú)對(duì)應(yīng)的一個(gè)looper,這個(gè)looper通過(guò)ThreadLocal來(lái)創(chuàng)建,保證每個(gè)線程只創(chuàng)建一個(gè)looper,looper初始化后就會(huì)調(diào)用looper.loop創(chuàng)建一個(gè)MessageQueue,這個(gè)方法在UI線程初始化的時(shí)候就會(huì)完成,我們不需要手動(dòng)創(chuàng)建

3.2 談?wù)剬?duì)HandlerThread的理解

一.介紹
HandlerThread繼承自Thread,當(dāng)線程開(kāi)啟時(shí),也就是它run方法運(yùn)行起來(lái)后,線程同時(shí)創(chuàng)建了一個(gè)含有消息隊(duì)列的Looper,并對(duì)外提供自己這個(gè)Looper對(duì)象的get方法,這就是它和普通
Thread唯一不同的地方。

二.好處

1.開(kāi)發(fā)中如果多次使用類似new Thread(){...}.start()這種方式開(kāi)啟一個(gè)子線程,會(huì)創(chuàng)建多個(gè)匿名線程,使得程序運(yùn)行起來(lái)越來(lái)越慢,而HandlerThread自帶Looper使他可以通過(guò)消息來(lái)多次重復(fù)使用當(dāng)前線程,節(jié)省開(kāi)支;

2.android系統(tǒng)提供的Handler類內(nèi)部的Looper默認(rèn)綁定的是UI線程的消息隊(duì)列,對(duì)于非UI線程又想使用消息機(jī)制,那么HandlerThread內(nèi)部的Looper是最合適的,它不會(huì)干擾或阻塞UI線程。

三.用法

HandlerThread既然本質(zhì)是Thread,為何前面加了一個(gè)Handler?android中Handler類本質(zhì)上就是從它內(nèi)部的Looper中不斷取消息,然后觸發(fā)它內(nèi)部的Callback接口的handleMessage方法,讓用戶去實(shí)現(xiàn)對(duì)消息的具體處理。而HandlerThread本身自帶Looper,只要它實(shí)現(xiàn)了Callback接口,那么HandlerThread也可以在自己線程內(nèi)處理自己線程發(fā)出的消息,充分實(shí)現(xiàn)非UI線程中較低開(kāi)支下的消息處理。

談?wù)剬?duì)HandlerThread的理解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容