多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > 從Android Handler內(nèi)部類到WeakReference的知識(shí)關(guān)聯(lián)

從Android Handler內(nèi)部類到WeakReference的知識(shí)關(guān)聯(lián)

來源:程序員人生   發(fā)布時(shí)間:2014-11-03 08:21:33 閱讀次數(shù):3764次

Handler:

普通用法:

Handler用于處理和從隊(duì)列MessageQueue中得到Message。1般我們要重寫Handler的handleMessage(Message msg){}方法來處理,以下代碼:

public class MainActivity extends Activity { private TextView textView; Handler normalHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Log.i("test",textView.getText().toString()); break; default: break; } }; }; }



問題:

這個(gè)時(shí)候Handler會(huì)被Android SDK中Lint工具檢查正告你(左側(cè)那個(gè)黃色燈泡+嘆號(hào)):This Handler class should be static or leaks might occur 

緣由:

This Handler class should be static:

(知識(shí)點(diǎn)1)為何靜態(tài)內(nèi)部類可以解決這個(gè)問題呢?或說靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的區(qū)分是甚么?

舉例:class A{int a; static int b class B{}  static class C{} }  (A是外部類,B非靜態(tài)內(nèi)部類,C靜態(tài)內(nèi)部類,a普通字段,b靜態(tài)字段)

1)B非靜態(tài)內(nèi)部類:

可以訪問A.a和A.b,也就是外部的屬性都能方位。由于B隱式的持有A類對(duì)象的援用,相當(dāng)于A的屬性

2)C靜態(tài)內(nèi)部類:

C只可以訪問A.b,不可以方位A.a。為何?由于C不含有A的援用,它和A類是同1個(gè)級(jí)別,只不過寫到了A類的內(nèi)部。

本例緣由:

Handler匿名內(nèi)部類,隱式的持有了外部類Activity的援用(這就是為何你能在handleMessage()中調(diào)用MainActivity中TextView等的屬性)。--->而以后調(diào)

Message message = normalHandler.obtainMessage();
normalHandler.sendMessageAtTime(message , 100*1000);

得到的message中又含有這個(gè)Handler的援用(可以看源碼)。

在100秒后message被履行,這期間message被放在MessageQueue中,MessageQueue在Looper中,Looper是線程的本地變量。

也就是說MainActivity即便生命周期走完了也不會(huì)垃圾回收,為何?由于Java的垃圾回收機(jī)制,就是看1個(gè)對(duì)象有無被援用(從線程中的主要對(duì)象開始,對(duì)象之間的援用構(gòu)成網(wǎng)狀結(jié)構(gòu),如果有類的對(duì)象不在這張網(wǎng)上,就證明它沒被援用。這就是數(shù)據(jù)結(jié)構(gòu)中圖的遍歷,甚么連通子圖,非連通子圖)。而本文中1個(gè)MainActivity被Handler持有援用,Handler被Message持有援用,Message被MessageQueue持有援用,MessageQueue被Looper持有援用,Looper為線程本地變量,線程不被摧毀,它就不會(huì)被燒毀。

所以即使用戶已切換、退出到別的Activity,MainActivity占有的內(nèi)存仍舊不會(huì)被釋放。


解決方案:

打破援用鏈:

1.Message在100秒后被處理,以后回收Message,然后回收MainActivity。(所以是實(shí)際上,你只要不發(fā)很長(zhǎng)時(shí)間的Message也不會(huì)有甚么問題)

2.使Handler不持有MainActivity的援用,用弱援用WeakReference:(簡(jiǎn)單講,就是只有WeakReference援用的對(duì)象,垃圾回收將回收該對(duì)象,以后再另寫1篇援用的文章吧)


正常代碼:

MyHandler handler = new MyHandler(this); public static class MyHandler extends Handler { private WeakReference<MainActivity> reference; public MyHandler(MainActivity activity) { reference = new WeakReference<MainActivity>(activity); } @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Log.i("test",textView.getText().toString()); break; default: break; } } }



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲成aⅴ人在线观看 | 69网站在线观看 | 成人性毛片 | 大胆国模一区二区三区伊人 | 色综合欧美综合天天综合 | 国产女人18毛片水真多18精品 | 日本a级精品一区二区三区 日本a级毛片免费视频播放 | 中文字幕动漫精品专区 | 在线国产中文字幕 | 欧美一级成人毛片视频 | 欧美成人亚洲高清在线观看 | 亚洲麻豆视频 | 国产精品久久久久久久毛片 | 能在线观看的一区二区三区 | 精品国产91久久久久久久 | 在线看的黄色网址 | 日美欧韩一区二去三区 | 黄色一级今| ww在线观视频免费观看w | 亚洲精品www| 欧美性色网 | 叼嘿视频在线免费观看 | 色黄在线 | 手机在线视频观看 | 自拍偷拍欧美 | www.色网站| 久久精品国产一区二区三区不卡 | 日本在线高清 | 拔擦拔擦8x华人免费久久 | 亚洲成a人片 | 久久久久在线观看 | 性生活免费视频网站 | 国产xx在线观看 | 久久精品国内一区二区三区 | 欧美成人免费一区在线播放 | 欧美18毛片免费看 | 欧美日韩中文国产 | 天天看毛片 | 国产精品久久久久久网站 | 国产在线精品福利91香蕉 | 欧美日韩在线视频播放 |