WeakReference 在android中的應(yīng)用

首先我們來看一段代碼

public class AutoActivity extends Activity {
Handler handler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        
    };
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_auto);
}
}

上面這段低嗎沒有什么問題,但是在handler對象創(chuàng)建的時候卻會報警告:This Handler class should be static or leaks might occur意思是:Handler

類應(yīng)該為static類型,否則可能會造成內(nèi)存泄漏沿侈。為什么會造成這種情況呢?這種情況就是由于android的特殊機制造成的:當一個android主線程被創(chuàng)

建的時候纬乍,同時會有一個Looper對象被創(chuàng)建笔时,而這個Looper對象會實現(xiàn)一個MessageQueue(消息隊列),當我們創(chuàng)建一個handler對象時斤寂,而handler的

作用就是放入和取出消息從這個消息隊列中,每當我們通過handler將一個msg放入消息隊列時揪惦,這個msg就會持有一個handler對象的引用遍搞。因此當

Activity被結(jié)束后,這個msg在被取出來之前器腋,這msg會繼續(xù)存活溪猿,但是這個msg持有handler的引用,而handler在Activity中創(chuàng)建纫塌,會持有Activity的引用诊县,

因而當Activity結(jié)束后,Activity對象并不能夠被gc回收措左,因而出現(xiàn)內(nèi)存泄漏依痊。

這個根本原因就是:Activity在被結(jié)束之后,MessageQueue并不會隨之被結(jié)束媳荒,如果這個消息隊列中存在msg抗悍,則導致持有handler的引用驹饺,但是又

由于Activity被結(jié)束了,msg無法被處理缴渊,從而導致永久持有handler對象赏壹,handler永久持有Activity對象,于是發(fā)生內(nèi)存泄漏衔沼。但是為什么為static類型就

會解決這個問題呢蝌借?因為在java中所有非靜態(tài)的對象都會持有當前類的強引用,而靜態(tài)對象則只會持有當前類的弱引用指蚁。聲明為靜態(tài)后菩佑,handler將會持

有一個Activity的弱引用,而弱引用會很容易被gc回收凝化,這樣就能解決Activity結(jié)束后稍坯,gc卻無法回收的情況。(至于為什么強引用不能夠被gc自動回收搓劫,而

弱引用對象為什么會被gc回收瞧哟,可以自行去google)。

所以解決這個警告就有幾種方法:

一:將hanlder對象聲明為靜態(tài)的對象枪向。

二:使用靜態(tài)內(nèi)部類勤揩,通過WeakReference實現(xiàn)對Activity的弱引用。具體實現(xiàn)看以下代碼:

public class AutoActivity extends Activity {

MyHandler handler = new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_auto);
}

static class MyHandler extends Handler{
    WeakReference<AutoActivity> mactivity;
    
    public MyHandler(AutoActivity activity){
        mactivity = new WeakReference<AutoActivity>(activity);
    }
    
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);           
        switch (msg.what) {
        case 100:               
            //在這里面處理msg
            //通過mactivity.get()獲取Activity的引用(即上下文context)
            break;              
        default:
            break;
        }
    }
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秘蛔,一起剝皮案震驚了整個濱河市陨亡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌深员,老刑警劉巖负蠕,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辨液,居然都是意外死亡虐急,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門滔迈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人被辑,你說我怎么就攤上這事燎悍。” “怎么了盼理?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵谈山,是天一觀的道長。 經(jīng)常有香客問我宏怔,道長奏路,這世上最難降的妖魔是什么畴椰? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮鸽粉,結(jié)果婚禮上斜脂,老公的妹妹穿的比我還像新娘。我一直安慰自己触机,他們只是感情好帚戳,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著儡首,像睡著了一般片任。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔬胯,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天对供,我揣著相機與錄音,去河邊找鬼氛濒。 笑死产场,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的泼橘。 我是一名探鬼主播涝动,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炬灭!你這毒婦竟也來了醋粟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤重归,失蹤者是張志新(化名)和其女友劉穎米愿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼻吮,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡育苟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椎木。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违柏。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖香椎,靈堂內(nèi)的尸體忽然破棺而出漱竖,到底是詐尸還是另有隱情,我是刑警寧澤畜伐,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布馍惹,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏万矾。R本人自食惡果不足惜悼吱,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望良狈。 院中可真熱鬧后添,春花似錦、人聲如沸们颜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窥突。三九已至努溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阻问,已是汗流浹背梧税。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留称近,地道東北人第队。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像刨秆,于是被迫代替她去往敵國和親凳谦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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