资讯专栏INFORMATION COLUMN

Android 使用 SoftReference 解决 Activity 存栈的内存泄漏问题

acrazing / 1415人阅读

摘要:利用存栈的方式来所有这个方法目前来看是对我直接有效的,但是实际运行过程中,会报内存泄漏的异常,原因是我的会对每一个启动时进行添加,而当我某个时,里对应的无法被,这样导致我的内存开销增加了。原文地址使用解决存栈的内存泄漏问题我的博客时空路由器

当 Android 想要退出应用时,我们总是希望完全退出。但是 Android 并没有提供一个完全退出 App 的函数。

Google 上搜索了一下,方法有很多,但是基本都是只退出了当前的 Activity, 并没有完全 finish 所有的 Activity。

利用存 Activity 栈的方式来 finish 所有这个方法目前来看是对我直接有效的,但是实际运行过程中, leakcanary 会报内存泄漏的异常,原因是我的 List 会对每一个 Activity 启动时进行添加,而当我 finish 某个 activity 时,List 里对应的 Activity 无法被 GC,这样导致我的内存开销增加了。如果我对每一次 Activity 的 finish 之后再清除对应的 List 里的 Activity, 这样我觉得会很麻烦,一点都不优雅。下面介绍一下 SoftReference 对象。

SoftReference,即“软引用”,由垃圾收集器根据内存需求自行清除。假设垃圾收集器在某个时间点确定对象是可以轻松访问的。那时候,它可能会选择原子地清除对该对象的所有软引用,以及对任何其他可轻松访问的对象的所有软引用,通过一个强引用链可以从该对象到达该对象。在同一时间或稍后的时间,它将排入在引用队列中注册的新清除的软引用。在虚拟机抛出OutOfMemoryError之前,所有对软到达对象的软引用都保证被清除。否则,在清除软引用的时间或者对一组对不同对象的引用将被清除的顺序没有约束。但是,鼓励虚拟机实现偏离清除最近创建或最近使用的软引用。

softreference 可以在 Activity 完成生命周期并且没有其他被引用的情况下被 GC 释放。所以 List 存 SoftReference 可以解决问题。

继承一个 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));
调用 exit() 方法

当需要退出 App 时,只需调用 MyApp 的 exit() 方法即可。

MyApp.getInstance().exit();

原文地址:Android 使用 SoftReference 解决 Activity 存栈的内存泄漏问题
我的博客:时空路由器

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67557.html

相关文章

  • Android内存泄漏定位、分析、解决全方案

    摘要:如果这个静态变量在生命周期结束后没有清空,就导致内存泄漏。因此造成内存泄露。注册没取消造成的内存泄露这种的内存泄露比纯的内存泄漏还要严重,因为其他一些程序可能引用系统的程序的对象比如注册机制。 原文链接 更多教程 为什么会发生内存泄漏 内存空间使用完毕之后未回收, 会导致内存泄漏。有人会问:Java不是有垃圾自动回收机制么?不幸的是,在Java中仍存在很多容易导致内存泄漏的逻辑(...

    yiliang 评论0 收藏0
  • 内存泄露从入门到精通三部曲之基础知识篇

    摘要:腾讯特约作者姚潮生首先以一个内存泄露实例来开始本节基础概念的内容。堆内存用于存放所有由创建的对象内容包括该对象其中的所有成员变量和数组。回到我们的问题,为什么内存会泄露堆内存中的长生命周期的对象持有短生命周期对象的强软引用,尽管 腾讯Bugly特约作者: 姚潮生 首先以一个内存泄露实例来开始本节基础概念的内容。 实例1:单例导致内存对象无法释放而泄露 showImg(http://i....

    nicercode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<