Android中的WeakReference 弱引用

WeakReference 弱引用

定義:弱引用嵌灰,與強(qiáng)引用(我們常見(jiàn)的引用方式)相對(duì);特點(diǎn)是:GC在回收時(shí)會(huì)忽略掉弱引用對(duì)象(忽略掉這種引用關(guān)系)背率,即:就算弱引用指向了某個(gè)對(duì)象,但只要該對(duì)象沒(méi)有被強(qiáng)引用指向,該對(duì)象也會(huì)被GC檢查時(shí)回收掉弧岳。

強(qiáng)引用實(shí)例自然不會(huì)被GC回收!

如何引出弱引用业踏?弱引用的實(shí)際用途是什么禽炬?

什么是內(nèi)存泄漏?Java使用有向圖機(jī)制勤家,通過(guò)GC自動(dòng)檢查內(nèi)存中的對(duì)象腹尖;如果GC發(fā)現(xiàn)一個(gè)或一組對(duì)象為不可達(dá)的狀態(tài),則將該對(duì)象從內(nèi)存中回收伐脖。也就是說(shuō):一個(gè)對(duì)象不被任何引用所指向热幔,則該對(duì)象會(huì)在被GC發(fā)現(xiàn)的時(shí)候回收。

可能導(dǎo)致內(nèi)存泄漏的實(shí)例:

Handler mHandler = newHandler() {

????@Override

????publicvoidhandleMessage(Message msg) {

????????mImageView.setImageBitmap(mBitmap);

????};

};

當(dāng)使用內(nèi)部類(或者匿名類)來(lái)創(chuàng)建Handler的時(shí)候讼庇,Handler對(duì)象會(huì)隱式地持有一個(gè)外部類的對(duì)象(通常是Activity)的引用(否則怎么可能通過(guò)Handler來(lái)操作Activity的View绎巨?)。而Handler通常會(huì)伴隨著一個(gè)耗時(shí)的后臺(tái)線程(比如:拉取網(wǎng)絡(luò)圖片)蠕啄;該后臺(tái)線程在任務(wù)執(zhí)行完畢后场勤,通過(guò)消息機(jī)制通知Handler戈锻,然后Handler把圖片更新到界面上。假設(shè)用戶在網(wǎng)絡(luò)請(qǐng)求過(guò)程中關(guān)閉了Activity和媳,正常情況下這個(gè)Activity不再被使用格遭,就有可能被GC回收;但此時(shí)線程尚未執(zhí)行完畢留瞳,而該線程持有Handler的引用(不然怎么發(fā)送消息給Handler拒迅?),Handler又持有Activity的引用她倘,就導(dǎo)致該Activity無(wú)法被回收(內(nèi)存泄漏)坪它,直到網(wǎng)絡(luò)請(qǐng)求結(jié)束(如:圖片下載完畢)。另外如果執(zhí)行了Handler的postDelayed()帝牡,該方法會(huì)將Handler裝入一個(gè)Message往毡,并把該Message推到MessageQueue中,由此產(chǎn)生了一條鏈?zhǔn)浇Y(jié)構(gòu):MessageQueue->Message->Handler->Activity靶溜,導(dǎo)致Activity被持有引用而無(wú)法被回收开瞭。(總結(jié):實(shí)例對(duì)象被其他對(duì)象持有引用,而無(wú)法被回收)

內(nèi)存泄漏的危害是什么罩息??jī)?nèi)存泄漏會(huì)引發(fā)虛擬機(jī)占用內(nèi)存過(guò)高嗤详。對(duì)于Android應(yīng)用程序來(lái)說(shuō),用戶打開(kāi)一個(gè)Activity瓷炮,使用完之后關(guān)閉葱色,內(nèi)存泄漏;執(zhí)行上述步驟多次娘香,程序占用內(nèi)存超過(guò)系統(tǒng)限制苍狰。

如何避免內(nèi)存泄漏?可以使用什么方法烘绽?由此引出了弱引用淋昭。

用于非必需對(duì)象,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次GC發(fā)生之前安接。當(dāng)GC工作時(shí)翔忽,無(wú)論當(dāng)前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象

/**

?* <功能描述> 用于加載Bitmap實(shí)例

?*

?* @author Administrator

?*/

publicclassAsyncDrawable extendsBitmapDrawable {

????privatefinalWeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

????publicAsyncDrawable(Resources res, Bitmap bitmap,

????????????BitmapWorkerTask bitmapWorkerTask) {

????????super(res, bitmap);

????????// bitmapWorkerTaskReference實(shí)例關(guān)聯(lián)BitmapWorkerTask

????????bitmapWorkerTaskReference = newWeakReference<BitmapWorkerTask>(

????????????????bitmapWorkerTask);

????}

????publicBitmapWorkerTask getBitmapWorkerTask() {

????????returnbitmapWorkerTaskReference.get();

????}

}

此時(shí)

WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference 關(guān)聯(lián)了

bitmapWorkerTask 實(shí)例(可認(rèn)為兩者是“好朋友”關(guān)系)盏檐;在虛擬機(jī)看來(lái) bitmapWorkerTask 實(shí)例是垃圾時(shí)歇式,但

WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference

不是垃圾。但垃圾并不會(huì)立即被回收胡野,也就是仍然可以使用對(duì)象 bitmapWorkerTask

實(shí)例材失;若該對(duì)象已被清理,則必須重新構(gòu)建對(duì)象给涕,并再一次關(guān)聯(lián)豺憔。

好處在于:可以申請(qǐng)任意多個(gè) bitmapWorkerTask 實(shí)例對(duì)象,并與弱引用對(duì)象關(guān)聯(lián)够庙;使用前恭应,先判斷是否已被釋放;如果已被釋放耘眨,則重新申請(qǐng)昼榛;若未被釋放,則直接使用剔难。WeakReference負(fù)責(zé)了釋放規(guī)則胆屿。

使用了上述代碼后,用戶在關(guān)閉Activity之后偶宫,就算后臺(tái)線程還沒(méi)有結(jié)束非迹,但由于僅有一個(gè)來(lái)自Handler的弱引用指向Activity,所有GC仍然會(huì)在檢查的時(shí)候把Activity回收掉纯趋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末憎兽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吵冒,更是在濱河造成了極大的恐慌纯命,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹栖,死亡現(xiàn)場(chǎng)離奇詭異亿汞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)揪阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門疗我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人南捂,你說(shuō)我怎么就攤上這事碍粥。” “怎么了黑毅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵嚼摩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我矿瘦,道長(zhǎng)枕面,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任缚去,我火速辦了婚禮潮秘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘易结。我一直安慰自己枕荞,他們只是感情好柜候,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著躏精,像睡著了一般渣刷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矗烛,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天辅柴,我揣著相機(jī)與錄音,去河邊找鬼瞭吃。 笑死碌嘀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歪架。 我是一名探鬼主播股冗,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼和蚪!你這毒婦竟也來(lái)了魁瞪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惠呼,失蹤者是張志新(化名)和其女友劉穎导俘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剔蹋,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旅薄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泣崩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片少梁。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矫付,靈堂內(nèi)的尸體忽然破棺而出凯沪,到底是詐尸還是另有隱情,我是刑警寧澤买优,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布妨马,位于F島的核電站,受9級(jí)特大地震影響杀赢,放射性物質(zhì)發(fā)生泄漏烘跺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一脂崔、第九天 我趴在偏房一處隱蔽的房頂上張望滤淳。 院中可真熱鬧,春花似錦砌左、人聲如沸脖咐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屁擅。三九已至偿凭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煤蹭,已是汗流浹背笔喉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工取视, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硝皂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓作谭,卻偏偏與公主長(zhǎng)得像稽物,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子折欠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348