Android内存优化

在Android开发中,内存优化是保持应用性能良好和避免内存泄漏的一个重要方面。以下是一些常用的内存优化方法和最佳实践:

  1. 避免内存泄漏:

    • 确保你在不需要时,及时注册和注销广播接收器、事件总线(如 EventBus)。
    • 避免在匿名类、内部类、线程或异步任务中持有Activity、Context或View的长生命周期的引用。
    • 使用WeakReferenceSoftReference 来引用需要长时间存储但又不妨碍它们被垃圾收集器回收的对象。
  2. 高效使用集合:

    • 根据具体需要选择合适大小和类型的集合类(如使用SparseArray系列代替HashMap)以减少内存开销。
    • 对于容器类,如List或Map,预先分配正确的容量可以避免重新分配和复制时的额外开销。
  3. 使用Bitmaps时的优化:

    • 使用适当的图像大小和分辨率。不要为小的ImageView加载高分辨率的图片。
    • 考虑在不影响用户体验的情况下对图片进行压缩。
    • 复用Bitmap的内存,尽可能使用BitmapFactory.Options.inBitmap
  4. 垃圾收集优化:

    • 减少创建短生命周期的对象,例如在循环中创建对象,这些都会增加垃圾回收的频率,影响性能。
    • 使用基本类型(如int, float)替代装箱类型(如Integer, Float),减少不必要的自动装箱操作。
  5. 内存监测工具:

    • 使用Android Studio的内存监测工具Profile GPU Rendering、Memory Profiler和Allocation Tracker来监控内存使用和寻找潜在的内存问题。
    • LeakCanary库可以用来检测应用中的内存泄漏。
  6. 优化布局:

    • 使用更加轻量级的View和布局,避免嵌套过深的布局,可以使用ConstraintLayout来减少布局的复杂性。
    • 使用ViewStubRecyclerView的延迟加载来加载UI,以减轻内存的即时开销。
  7. 谨慎使用单例和静态集合:

    • 单例和静态集合如果不正确使用,可能会造成内存泄漏。确保它们不会意外地保持对Context或其他大对象的引用。
  8. 使用Android系统提供的组件和模式:

    • 当应用进入后台时,利用onTrimMemory()回调来释放不需要的资源。
    • 使用ViewModel来存储和管理与UI相关的数据,避免在Activity/Fragment重建时丢失数据,而降低性能。
  9. 避免在主线程完成复杂和耗时的操作

    • 使用异步处理任务,例如AsyncTaskRxJava、协程来避免在主线程中进行大量的计算,这样可以减少因为暂停垃圾回收造成的卡顿。
  10. 减少资源消耗:

    • 避免使用不需要的资源,例如信号量、服务等,确保在不使用它们时将它们关闭或者注销。

具体示例

1. Handler内存泄露的原因是什么?

2. EventBus取消注册

// 取消注册
        EventBus.getDefault().unregister(this);

3. 管理RxJava的生命周期

在使用RxJava的时候,如果没有及时解除订阅,在退出Activity的时候,异步线程还在执行,对Activity的引用还在,此时就会产生内存泄露问题。
可使用RxLifecycle,传送门:https://github.com/trello/RxLifecycle

引入依赖

    implementation 'com.trello.rxlifecycle4:rxlifecycle:4.0.2'
    implementation 'com.trello.rxlifecycle4:rxlifecycle-components:4.0.2'

让你的Activity继承RxAppCompatActivity,Fragment继承RxFragment,其余类似,然后使用bindUntilEvent或者bindToLifecycle

  Observable.interval(1000, TimeUnit.MILLISECONDS)
            .compose(bindUntilEvent(ActivityEvent.DESTROY)) //当前Activity执行到onDestroy时,Observable取消订阅
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Throwable {
                    Log.i(tag, "accept:" + aLong);
                }
            });

        Observable.interval(1000, TimeUnit.MILLISECONDS)
                .compose(bindToLifecycle())
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Throwable {
                        Log.i(tag, "accept:" + aLong);
                    }
                });

使用bindToLifecycle:
如果Observable在onCreate执行,那么当执行到onDestroy时取消订阅。
如果Observable在onStart执行,那么当执行到onStop时取消订阅。
如果Observable在onResume执行,那么当执行到onPause时取消订阅。

  1. 加载大量图片时
    4.1 参考郭霖大神的博客
    Android高效加载大图、多图解决方案,有效避免程序OOM
    Android照片墙应用实现,再多的图片也不怕崩溃
    Android瀑布流照片墙实现,体验不规则排列的美感

    总结:
    关键是用好内存和硬盘缓存
    a. 先从内存中读取(使用LruCache方式)
    b. 从本地文件读取
    c. 再从网络上进行下载,保存到本地文件以及 通过压缩后,保存到内存中

    4.2 Glide 缓存策略
    https://www.jianshu.com/p/2e25eb85b059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些Android内存优化的方法: 1. 使用Android内存管理工具 Android提供了一些内存管理工具,如hprof-conv,dumpsys和adb shell am命令等,可以帮助你检查内存占用情况,并找出内存泄漏等问题。 2. 优化布局 避免使用过多的布局嵌套,尽量使用ConstraintLayout等可减少嵌套的布局,以减少内存占用。 3. 优化资源文件 对于大型的图片和其他资源文件,可以使用压缩算法减少其占用内存的大小,减少应用的内存占用。 4. 使用缓存机制 使用缓存机制可以减少从网络或磁盘中读取数据的次数,降低了内存的使用。 5. 控制加载数据的数量 为了减少内存占用,应该控制加载数据的数量。例如,在列表中,仅加载视图范围内的数据。 6. 使用分页加载 分页加载可以分多次将数据加载到内存中,而不是一次性将所有数据加载到内存中。 7. 释放不使用的资源 及时释放不使用的资源,例如:Activity中的布局文件、Bitmap等等。 8. 避免使用静态变量 静态变量可以保存状态和数据,但它们生命周期较长,在某些情况下可能需要较长时间才能释放它们的内存。因此,最好避免使用静态变量。 9. 使用BitmapFactory.Options参数 使用BitmapFactory.Options参数可以在加载大型图片时控制它们的大小和内存占用。例如,可以使用inSampleSize参数减小图片的大小。 总之,Android内存管理是复杂而重要的部分,应该重视内存优化。以上的方法只是一些参考,需要结合具体应用场景来进行优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值