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

資訊專欄INFORMATION COLUMN

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

番茄西紅柿 / 2161人閱讀

摘要:但是如果你直接創建一個對象,然后重寫內部方法,那么一定會提醒你會有內存泄漏的可能。所以當的生命周期結束后,而中還存在未處理的消息,那么上面一連串的引用關系就不允許的對象被回收,就造成了內存泄漏。

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

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線程的。具體點就是在子線程進行耗時操作,比如獲取網絡圖片,然后需要在主線程更新圖片,就需要handler+Message+Loop+MessageQueue來幫忙啦。

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

為什么會造成內存泄漏

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

那么handler什么時候會造成內存泄漏呢?

發送延遲消息

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

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

解決辦法

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

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

所以第一種方法,自定義靜態內部類,如果想使用外部類的方法,那就通過弱引用的方法引入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中創建Myahndler對象,通過重寫myHandleMessage方法進行消息處理。

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/7034.html

相關文章

  • 每日一道面試)---一般什么情況下會導致內存泄漏

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

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

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

    tracymac7 評論0 收藏0

發表評論

0條評論

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