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

資訊專欄INFORMATION COLUMN

Android 使用 SoftReference 解決 Activity 存棧的內(nèi)存泄漏問題

acrazing / 1447人閱讀

摘要:利用存棧的方式來所有這個(gè)方法目前來看是對我直接有效的,但是實(shí)際運(yùn)行過程中,會報(bào)內(nèi)存泄漏的異常,原因是我的會對每一個(gè)啟動時(shí)進(jìn)行添加,而當(dāng)我某個(gè)時(shí),里對應(yīng)的無法被,這樣導(dǎo)致我的內(nèi)存開銷增加了。原文地址使用解決存棧的內(nèi)存泄漏問題我的博客時(shí)空路由器

當(dāng) Android 想要退出應(yīng)用時(shí),我們總是希望完全退出。但是 Android 并沒有提供一個(gè)完全退出 App 的函數(shù)。

Google 上搜索了一下,方法有很多,但是基本都是只退出了當(dāng)前的 Activity, 并沒有完全 finish 所有的 Activity。

利用存 Activity 棧的方式來 finish 所有這個(gè)方法目前來看是對我直接有效的,但是實(shí)際運(yùn)行過程中, leakcanary 會報(bào)內(nèi)存泄漏的異常,原因是我的 List 會對每一個(gè) Activity 啟動時(shí)進(jìn)行添加,而當(dāng)我 finish 某個(gè) activity 時(shí),List 里對應(yīng)的 Activity 無法被 GC,這樣導(dǎo)致我的內(nèi)存開銷增加了。如果我對每一次 Activity 的 finish 之后再清除對應(yīng)的 List 里的 Activity, 這樣我覺得會很麻煩,一點(diǎn)都不優(yōu)雅。下面介紹一下 SoftReference 對象。

SoftReference,即“軟引用”,由垃圾收集器根據(jù)內(nèi)存需求自行清除。假設(shè)垃圾收集器在某個(gè)時(shí)間點(diǎn)確定對象是可以輕松訪問的。那時(shí)候,它可能會選擇原子地清除對該對象的所有軟引用,以及對任何其他可輕松訪問的對象的所有軟引用,通過一個(gè)強(qiáng)引用鏈可以從該對象到達(dá)該對象。在同一時(shí)間或稍后的時(shí)間,它將排入在引用隊(duì)列中注冊的新清除的軟引用。在虛擬機(jī)拋出OutOfMemoryError之前,所有對軟到達(dá)對象的軟引用都保證被清除。否則,在清除軟引用的時(shí)間或者對一組對不同對象的引用將被清除的順序沒有約束。但是,鼓勵虛擬機(jī)實(shí)現(xiàn)偏離清除最近創(chuàng)建或最近使用的軟引用。

softreference 可以在 Activity 完成生命周期并且沒有其他被引用的情況下被 GC 釋放。所以 List 存 SoftReference 可以解決問題。

繼承一個(gè) Application 類
public class MyApp extends Application {
    private List> activityList = new LinkedList<>();
    private static MyApp instance;
    public static Context context;

    @Override
    public void onCreate(){
        super.onCreate();
        context = getApplicationContext();
        LeakCanary.install(this);
    }

    public static MyApp getInstance() {
        if(null == instance) {
            instance = new MyApp();
        }
        return instance;
    }
    //添加 Activity 的軟引用到容器中
    public void addActivity(SoftReference softReference)  {
        activityList.add(softReference);
    }
    //遍歷所有Activity并finish
    public void exit(){
        for(int i=0;i
添加 Activity 的軟引用

在 BaseActivity 的 onCreate() 方法對繼承的 Activity 添加軟引用到 MyApp 的 List 里。

MyApp.getInstance().addActivity(new SoftReference<>(this));
調(diào)用 exit() 方法

當(dāng)需要退出 App 時(shí),只需調(diào)用 MyApp 的 exit() 方法即可。

MyApp.getInstance().exit();

原文地址:Android 使用 SoftReference 解決 Activity 存棧的內(nèi)存泄漏問題
我的博客:時(shí)空路由器

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

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

相關(guān)文章

  • Android內(nèi)存泄漏定位、分析、解決全方案

    摘要:如果這個(gè)靜態(tài)變量在生命周期結(jié)束后沒有清空,就導(dǎo)致內(nèi)存泄漏。因此造成內(nèi)存泄露。注冊沒取消造成的內(nèi)存泄露這種的內(nèi)存泄露比純的內(nèi)存泄漏還要嚴(yán)重,因?yàn)槠渌恍┏绦蚩赡芤孟到y(tǒng)的程序的對象比如注冊機(jī)制。 原文鏈接 更多教程 為什么會發(fā)生內(nèi)存泄漏 內(nèi)存空間使用完畢之后未回收, 會導(dǎo)致內(nèi)存泄漏。有人會問:Java不是有垃圾自動回收機(jī)制么?不幸的是,在Java中仍存在很多容易導(dǎo)致內(nèi)存泄漏的邏輯(...

    yiliang 評論0 收藏0
  • 內(nèi)存泄露從入門到精通三部曲之基礎(chǔ)知識篇

    摘要:騰訊特約作者姚潮生首先以一個(gè)內(nèi)存泄露實(shí)例來開始本節(jié)基礎(chǔ)概念的內(nèi)容。堆內(nèi)存用于存放所有由創(chuàng)建的對象內(nèi)容包括該對象其中的所有成員變量和數(shù)組。回到我們的問題,為什么內(nèi)存會泄露堆內(nèi)存中的長生命周期的對象持有短生命周期對象的強(qiáng)軟引用,盡管 騰訊Bugly特約作者: 姚潮生 首先以一個(gè)內(nèi)存泄露實(shí)例來開始本節(jié)基礎(chǔ)概念的內(nèi)容。 實(shí)例1:單例導(dǎo)致內(nèi)存對象無法釋放而泄露 showImg(http://i....

    nicercode 評論0 收藏0

發(fā)表評論

0條評論

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