Handler引發(fā)的內(nèi)存泄漏

在我們寫代碼的時候奄侠,為了實現(xiàn)在子線程更新UI的需要蓬痒,我們會定義一個Handler屬性丛肢,并聲明一個匿名內(nèi)部類诈乒,重寫handleMessage方法,就像下面這樣罩扇。

public class MainActivity extends AppCompatActivity {
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_other);
    }
}

那如果細心看下,其實Android Studio會給我一個提示信息怕磨。


意思就是我們應(yīng)該定義一個靜態(tài)的類喂饥,這樣可能會導(dǎo)致內(nèi)存泄漏。

OK肠鲫,那這里為什么會引起內(nèi)存泄漏员帮?首先我們要明白其實匿名內(nèi)部類或者內(nèi)部類都會隱形持有外部類的引用,其實這里Handler就持有MainActivity的引用导饲,在Handler中我們可以隨意調(diào)用MainActivity的方法捞高。在我們發(fā)送消息時handler會被復(fù)制給message.target,并放入消息隊列。但是主線的消息隊列并不會隨著Activity的銷毀而銷毀渣锦,因此導(dǎo)致Activity的泄漏棠枉。那知道了泄漏的原因我們就知道該怎解決了。
1泡挺、定義靜態(tài)內(nèi)部類

private static class MyHandler extends Handler{
    private WeakReference<MainActivity> mActivity;

    public MyHandler(MainActivity activity) {
        mActivity = new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
}

在靜態(tài)內(nèi)部類中持有Activity的弱連接這樣就不會引發(fā)內(nèi)存泄漏了。但是這樣的話消息隊列中還是有為處理完的消息命浴,其實Activity銷毀后娄猫,再處理這個消息已經(jīng)沒有意義了,因此有了第二種方法生闲。
2媳溺、onDestory時清理消息
既然內(nèi)存泄漏是因為Activity銷毀而消息還在,那我在OnDestory時把它清理掉不就行了碍讯,幸運的是Handler提供了這樣的方法:


我們可以直接調(diào)用removeCallbacksAndMessages()方法清理message悬蔽。
注意:這個方法并不是清空消息棧中所有的message,而是清理message.target等于這個handler的message捉兴,因此不會影響到無關(guān)的message和Handler蝎困。
參看下面的MessageQueue.removeCallbacksAndMessages

void removeCallbacksAndMessages(Handler h, Object object) {
    if (h == null) {
        return;
    }

    synchronized (this) {
        Message p = mMessages;

        // Remove all messages at front.
        while (p != null && p.target == h
                && (object == null || p.obj == object)) {
            Message n = p.next;
            mMessages = n;
            p.recycleUnchecked();
            p = n;
        }

        // Remove all messages after front.
        while (p != null) {
            Message n = p.next;
            if (n != null) {
                if (n.target == h && (object == null || n.obj == object)) {
                    Message nn = n.next;
                    n.recycleUnchecked();
                    p.next = nn;
                    continue;
                }
            }
            p = n;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倍啥,隨后出現(xiàn)的幾起案子禾乘,更是在濱河造成了極大的恐慌,老刑警劉巖虽缕,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件始藕,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機伍派,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門江耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诉植,你說我怎么就攤上這事祥国。” “怎么了倍踪?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵系宫,是天一觀的道長。 經(jīng)常有香客問我建车,道長扩借,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任缤至,我火速辦了婚禮潮罪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘领斥。我一直安慰自己嫉到,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布月洛。 她就那樣靜靜地躺著何恶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚼黔。 梳的紋絲不亂的頭發(fā)上细层,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音唬涧,去河邊找鬼疫赎。 笑死,一個胖子當著我的面吹牛碎节,可吹牛的內(nèi)容都是我干的捧搞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼狮荔,長吁一口氣:“原來是場噩夢啊……” “哼胎撇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起殖氏,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤创坞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后受葛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题涨,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡偎谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纲堵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡雨。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖席函,靈堂內(nèi)的尸體忽然破棺而出铐望,到底是詐尸還是另有隱情,我是刑警寧澤茂附,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布正蛙,位于F島的核電站,受9級特大地震影響营曼,放射性物質(zhì)發(fā)生泄漏乒验。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一蒂阱、第九天 我趴在偏房一處隱蔽的房頂上張望锻全。 院中可真熱鬧,春花似錦录煤、人聲如沸鳄厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽了嚎。三九已至,卻和暖如春廊营,著一層夾襖步出監(jiān)牢的瞬間歪泳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工赘风, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵刘。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓邀窃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親假哎。 傳聞我的和親對象是個殘疾皇子瞬捕,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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