Android Handler引起的內(nèi)存泄漏+匯總

1.Handler 引起的內(nèi)存泄漏

Handler是Andorid給我們提供的一套UI更新機(jī)制秩霍,同時(shí)它也是一套消息處理機(jī)制舆乔。
使用Handler消息處理機(jī)制在多個(gè)線程并發(fā)更新UI的同時(shí) 采郎,可以保證線程安全荚守。


先看看下圖:


出現(xiàn)了一大片黃色警告端铛,what每聪?怎么回事的旦棉。黃色警告的大概意思:Handler可能會(huì)內(nèi)存泄漏,推薦使用靜態(tài)內(nèi)部類+實(shí)例化弱引用药薯。在使用Handler時(shí)如果直接使用匿名內(nèi)部類的方式創(chuàng)建Handler對(duì)象IDE會(huì)發(fā)出警告绑洛,提示內(nèi)存泄漏風(fēng)險(xiǎn)。非靜態(tài)的內(nèi)部類和匿名類會(huì)隱式地持有一個(gè)他們外部類的引用童本。靜態(tài)內(nèi)部類則不會(huì)真屯。

上圖的Handler正是通過(guò)內(nèi)部類創(chuàng)建的,它可能會(huì)阻止外部類被垃圾收集(假如上圖的程序代碼是在Activity類里創(chuàng)建的穷娱,就算關(guān)閉了Activity绑蔫,Activity還是無(wú)法被回收的)。

如果程序代碼對(duì)主線程以外的線程使用循環(huán)程序或MessageQueue泵额,就沒(méi)什么問(wèn)題配深。但是如果程序代碼使用到了主線程的Looper或MessageQueue,則很可能會(huì)導(dǎo)致內(nèi)存泄漏嫁盲。有以下解決方案:

方法一:

添加這個(gè) @SuppressLint("HandlerLeak")注解篓叶,防止由handler引起的內(nèi)存溢出,此時(shí)黃色警告就沒(méi)有了。



方法二:

在實(shí)例化Handler時(shí)可以使用回調(diào)接口缸托,以避免必須實(shí)現(xiàn)自己的Handler子類左敌。如下圖:

方法三:

使用靜態(tài)內(nèi)部類+實(shí)例化弱引用

(ps:? Handler可以發(fā)送和處理消息對(duì)象或Runnable對(duì)象,這些消息對(duì)象和Runnable對(duì)象與一個(gè)線程相關(guān)聯(lián)俐镐。每個(gè)Handler的實(shí)例都關(guān)聯(lián)了一個(gè)線程和線程的消息隊(duì)列矫限。當(dāng)創(chuàng)建了一個(gè)Handler對(duì)象時(shí),一個(gè)線程或消息隊(duì)列同時(shí)也被創(chuàng)建佩抹,該Handler對(duì)象將發(fā)送和處理這些消息或Runnable對(duì)象叼风。)

2.Handler與線程相關(guān)的圖解

3.除了Handler引起的內(nèi)存泄漏,以下常見(jiàn)操作也會(huì)引起內(nèi)存泄漏:

3.1? IO操作沒(méi)有關(guān)流以及Cursor游標(biāo)的一些操作匹摇,忘記關(guān)掉Cusor咬扇;

3.2??Bitmap對(duì)象沒(méi)有recycle()釋放內(nèi)存;

3.3? 發(fā)送廣播廊勃、定義廣播接收者時(shí)沒(méi)有反注冊(cè)懈贺,以及EventBus的反注冊(cè);

3.4 接口回調(diào)時(shí)界面間持有引用坡垫,關(guān)閉不完全很可能引起的內(nèi)存泄漏梭灿;

比如,網(wǎng)絡(luò)請(qǐng)求使用Activity當(dāng)做回調(diào)冰悠,如果網(wǎng)速慢堡妒,設(shè)置了30秒才會(huì)鏈接超時(shí),此時(shí)按下返回鍵溉卓,Activity會(huì)被網(wǎng)絡(luò)請(qǐng)求給引用大約30秒然后才有可能被釋放皮迟。

3.5?單例模式導(dǎo)致內(nèi)存泄漏(實(shí)質(zhì)是靜態(tài)變量引用Activity),由于它的靜態(tài)特性使得其生命周期跟應(yīng)用一樣長(zhǎng)桑寨,如果我們把上下文Context(比如說(shuō)一個(gè)Activity)傳入到了單例類中的執(zhí)行業(yè)務(wù)邏輯伏尼,這時(shí)候靜態(tài)變量就引用了我們的Activity,如果沒(méi)有及時(shí)置空尉尾,就會(huì)在這個(gè)Activity?finish的時(shí)候爆阶,導(dǎo)致該Activty一直駐留在內(nèi)存中,并發(fā)生內(nèi)存泄漏沙咏,所以傳入上下文對(duì)象時(shí)應(yīng)Application的Context來(lái)替代和Activity相關(guān)的Context辨图;

3.6 bindService綁定服務(wù)后,沒(méi)有unbindService解綁服務(wù)肢藐,會(huì)導(dǎo)致ServiceConnection 泄露故河。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者吆豹。
  • 序言:七十年代末忧勿,一起剝皮案震驚了整個(gè)濱河市杉女,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸳吸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速勇,死亡現(xiàn)場(chǎng)離奇詭異晌砾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烦磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)养匈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人都伪,你說(shuō)我怎么就攤上這事呕乎。” “怎么了陨晶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵猬仁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我先誉,道長(zhǎng)湿刽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任褐耳,我火速辦了婚禮诈闺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铃芦。我一直安慰自己雅镊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布刃滓。 她就那樣靜靜地躺著仁烹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪注盈。 梳的紋絲不亂的頭發(fā)上晃危,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音老客,去河邊找鬼僚饭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胧砰,可吹牛的內(nèi)容都是我干的鳍鸵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尉间,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼偿乖!你這毒婦竟也來(lái)了击罪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贪薪,失蹤者是張志新(化名)和其女友劉穎媳禁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體画切,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竣稽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霍弹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毫别。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖典格,靈堂內(nèi)的尸體忽然破棺而出岛宦,到底是詐尸還是另有隱情,我是刑警寧澤耍缴,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布砾肺,位于F島的核電站,受9級(jí)特大地震影響私恬,放射性物質(zhì)發(fā)生泄漏债沮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一本鸣、第九天 我趴在偏房一處隱蔽的房頂上張望疫衩。 院中可真熱鬧,春花似錦荣德、人聲如沸闷煤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲤拿。三九已至,卻和暖如春署咽,著一層夾襖步出監(jiān)牢的瞬間近顷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工宁否, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窒升,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓慕匠,卻偏偏與公主長(zhǎng)得像饱须,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子台谊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容