国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

番茄西紅柿 / 2155人閱讀

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

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

handler作用

SDK文檔是這么說(shuō)的。

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.

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

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

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

Android內(nèi)存泄漏:需要被GC回收的對(duì)象因?yàn)楸黄渌婊畹膶?duì)象所持有引用,而導(dǎo)致GC不能回收此對(duì)象。那么這塊內(nèi)存就會(huì)在程序運(yùn)行期間長(zhǎng)期被占據(jù),造成系統(tǒng)內(nèi)存的浪費(fèi),使系統(tǒng)運(yùn)行緩慢甚至崩潰。

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

發(fā)送延遲消息

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

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

解決辦法

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

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

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

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對(duì)象,通過(guò)重寫(xiě)myHandleMessage方法進(jìn)行消息處理。

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/7034.html

相關(guān)文章

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

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

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

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

    tracymac7 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<