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

简介: 当 Android 想要退出应用时,我们总是希望完全退出。但是 Android 并没有提供一个完全退出 App 的函数。Google 上搜索了一下,方法有很多,但是基本都是只退出了当前的 Activity, 并没有完全 finish 所有的 Activity。

当 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<SoftReference<Activity>> 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<Activity> softReference)  {
        activityList.add(softReference);
    }
    //遍历所有Activity并finish
    public void exit(){
        for(int i=0;i<activityList.size();i++){
            Activity activity = activityList.get(i).get();
            if(activity != null){
                activity.finish();
            }
        }
        System.exit(0);
    }
}

添加 Activity 的软引用

在 BaseActivity 的 onCreate() 方法对继承的 Activity 添加软引用到 MyApp 的 List 里。

MyApp.getInstance().addActivity(new SoftReference<>(this));

调用 exit() 方法

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

MyApp.getInstance().exit();

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

目录
相关文章
|
4月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
142 1
|
2月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
3月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
118 16
|
3月前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
4月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
111 6
|
4月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
41 3
|
4月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
41 3
|
4月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
67 2
|
5月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
318 4
Android性能测试——发现和定位内存泄露和卡顿
|
4月前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)