内存优化之浅谈onLowMemory和onTrimMemory

android开发的过程中,我们会经常遇到oom的情况,这个问题一直是个头疼的问题。它就像是风湿的病症一样,很难根治。

Android每个应用都有独立的DVM,每个DVM的内存分配也是有限的。当内存不足的时候,系统会杀死后台进程。这个时候ComponentCallbacksonLowMemory方法会被回调,ApplicationActivityFragementService都是它的子类

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.e(tag,"有后台进程被杀了");
    }

而ComponentCallbacks的子类ComponentCallbacks2中的onTrimMemory(int level)方法会频繁回调,通过level来判断回调的情况

    /**
     * 当onTrimMemory被调用的时候,应该考虑降低应用的内存资源。
     */
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        switch (level){
            /*
             * 应用正在运行,并且不会被杀死,但系统已经处于低内存状态,并且开始杀死LRU缓存里的进程。
             */
            case TRIM_MEMORY_RUNNING_MODERATE:
                Log.e(tag,"TRIM_MEMORY_RUNNING_MODERATE");
                break;
            /*
             * 应用正在运行,并且不会被杀死,但系统处于内存更低的状态,所以应该释放无用资源以提高系统性能,当前的低内存已经影响到你的app体验了。
             */
            case TRIM_MEMORY_RUNNING_LOW:
                Log.e(tag,"TRIM_MEMORY_RUNNING_LOW");
                break;
            /*
             * 应用还在运行,但系统已经杀死了LRU缓存里的大多数进程,所以应该在此时释放所有非关键的资源。
             * 如果内存还是无法降低,高优先级保持的应用也存在被杀的风险。
             */
            case TRIM_MEMORY_RUNNING_CRITICAL:
                Log.e(tag,"TRIM_MEMORY_RUNNING_CRITICAL");
                break;
            /*
             * 表示应用程序的所有UI界面被隐藏了,即用户点击了Home键或者Back键导致应用的UI界面不可见。可以释放资源,也可以保存需要的数据。
             */
            case TRIM_MEMORY_UI_HIDDEN :
                Log.e(tag,"TRIM_MEMORY_UI_HIDDEN");
                break;
            /*
             * 内存不足,并且该进程是后台进程。
             */
            case TRIM_MEMORY_BACKGROUND :
                Log.e(tag,"TRIM_MEMORY_BACKGROUND");
                break;
            /*
             * 内存不足,并且该进程在后台进程列表的中部。
             */
            case TRIM_MEMORY_MODERATE :
                Log.e(tag,"TRIM_MEMORY_MODERATE");
                break;
            /*
             * 内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
             */
            case TRIM_MEMORY_COMPLETE :
                Log.e(tag,"TRIM_MEMORY_COMPLETE");
                break;

        }
    }

可以在ApplicationActivityFragementServiceContentProvider中重写onTrimMemory(int level)onLowMemory()这两个方法来实现对资源的释放,比如Bitmap或者List


 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值