成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

每日一道面試題(第1期)---自定義handler如何有效保證內(nèi)存泄漏問題

番茄西紅柿 / 2166人閱讀

摘要:但是如果你直接創(chuàng)建一個對象,然后重寫內(nèi)部方法,那么一定會提醒你會有內(nèi)存泄漏的可能。所以當(dāng)?shù)纳芷诮Y(jié)束后,而中還存在未處理的消息,那么上面一連串的引用關(guān)系就不允許的對象被回收,就造成了內(nèi)存泄漏。

零零碎碎的東西總是記不長久,僅僅學(xué)習(xí)別人的文章也只是他人咀嚼后留下的殘渣。無意中發(fā)現(xiàn)了這個每日一道面試題,想了想如果只是簡單地去思考,那么不僅會收效甚微,甚至難一點的題目自己可能都懶得去想,堅持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激勵自己堅持下去。

handler作用

SDK文檔是這么說的。

There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.

我們一般就是用來更新UI線程的。具體點就是在子線程進(jìn)行耗時操作,比如獲取網(wǎng)絡(luò)圖片,然后需要在主線程更新圖片,就需要handler+Message+Loop+MessageQueue來幫忙啦。

但是如果你直接創(chuàng)建一個handler對象,然后重寫內(nèi)部handlerMessage方法,那么AS一定會提醒你會有內(nèi)存泄漏的可能。

為什么會造成內(nèi)存泄漏

Android內(nèi)存泄漏:需要被GC回收的對象因為被其他存活的對象所持有引用,而導(dǎo)致GC不能回收此對象。那么這塊內(nèi)存就會在程序運行期間長期被占據(jù),造成系統(tǒng)內(nèi)存的浪費,使系統(tǒng)運行緩慢甚至崩潰。

那么handler什么時候會造成內(nèi)存泄漏呢?

發(fā)送延遲消息

眾所周知,匿名內(nèi)部類持有外部類的引用,那么handler對象就會持有activity對象的引用。handler發(fā)送message到MessageQueue,message持有handler的引用,而MessageQueue會持有message的引用,而MessageQueue是屬于TLS(ThreadLocalStorage)線程,是與Activity不同的生命周期。

所以當(dāng)Activity的生命周期結(jié)束后,而MessageQueue中還存在未處理的消息,那么上面一連串的引用關(guān)系就不允許Activity的對象被回收,就造成了內(nèi)存泄漏。

解決辦法

知道了內(nèi)存泄漏是由引用鏈造成的,那么解決方法也就是破壞上面的引用鏈。

首先是引用的類型,有強(qiáng)引用、軟引用、弱引用、虛引用,上面的引用鏈都是強(qiáng)引用。

所以第一種方法,自定義靜態(tài)內(nèi)部類,如果想使用外部類的方法,那就通過弱引用的方法引入Activity對象。

public class BaseActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void myHandleMessage(Message msg){}

    static class MyHandler extends Handler{
        WeakReference mActivityReference;
        public MyHandler(BaseActivity activity){
            mActivityReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            BaseActivity activity = mActivityReference.get();
            if(activity != null){
                activity.myHandleMessage(msg);
            }
        }
    }
}

你可以自定義在BaseActivity中,在其他Activity中創(chuàng)建Myahndler對象,通過重寫myHandleMessage方法進(jìn)行消息處理。

這種方法就是處理了Activity與Handler之間的引用,這種引用可以再GC時被回收。

第二種,就是處理后面的引用。既然是Activity要被回收時還有未被處理的消息,那么在Activity要被回收時清除消息就可以了。

@Override
    protected void onDestroy() {
        super.onDestroy();
        if(mHandler != null){
            mHandler.removeCallbacksAndMessages(null);
        }
    }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7034.html

相關(guān)文章

  • 每日一道面試)---一般什么情況下會導(dǎo)致內(nèi)存泄漏

    摘要:顯而易見的,當(dāng)這個是的時,就不存在內(nèi)存泄漏的問題。這個我在第一期自定義如何有效保證內(nèi)存泄漏問題已經(jīng)說得很明白了。 零零碎碎的東西總是記不長久,僅僅學(xué)習(xí)別人的文章也只是他人咀嚼后留下的殘渣。無意中發(fā)現(xiàn)了這個每日一道面試題,想了想如果只是簡單地去思考,那么不僅會收效甚微,甚至難一點的題目自己可能都懶得去想,堅持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激...

    番茄西紅柿 評論0 收藏0
  • 金三銀四,2019大廠Android高級工程師面試整理

    摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會問到混合開發(fā)的知識,至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...

    tracymac7 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<