实现android内存检测的作用在哪里?

当你处理一个非常大的图片缩放的时候,由于使用了ARGB8888的色彩,导致一个像素是4Byte。一个2000×3000分辨率的图片消耗的内存是:23437.5KB。这时候消耗的内存是23.4M的内存。android2.2官方ROM最大内存是24M,那么打开美图秀秀,处理一张2000像素的图的时候就会发生问题, 4.0官方ROM的话,你的app最大内存限制是64M,4.4的时候,内存限制是96M。都不是很大,所以内存还是很紧张的。

这时候在一些手机上就会出现OOM的情况。

所以,在遇到这种情况的时候需要先检测下还能不能再申请内存了!

PS:现在很多ROM厂商都修改了最大内存限制,我做过测试我的L36H,内存限制是256MB。这样的话可以使用更多的内存。但是还有很多品牌没有做修改,三星是没有修改4.0 4.2都是64M,moto也没有,Nexus 系列更是 没有修改。



这里我写了个工具类,供使用的时候操作,获取手机剩余内存和app的剩余可消耗的内存。


废话不说直接上代码!


<span style="font-size:14px;">package com.commons.utils.memory;import android.annotation.TargetApi;import android.app.ActivityManager;import android.content.Context;import android.os.Build;import android.util.Log;/** *内存的工具类 */public class MemoryUtils {    private static final String TAG="MemoryUtils";    /**     * 打印当前手机内存信息应用的内存信息     */    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)    public static void printMemoryInfo()    {        final String TAG="MemoryUtils.printMemoryInfo()";        //打印当前APP内存信息        //开启了  android:largeHeap="true" 后,就是启用了流氓应用的内存限制        //打印当前应用内存信息        Runtime rt = Runtime.getRuntime();        Log.d(TAG, "APP当前内存状态: 最大可申请内存:" + rt.maxMemory() / 1024/1024 +"MB 已申请内存:" + rt.totalMemory() / 1024/1024 +  "MB 空闲内存:"+rt.freeMemory()/1024/1024+"MB");    }    /**     * 获得app可用内存的字节数  这个类不需要try,catch理论上不会报错     */    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    public static long getAppSurplusMe()    {        final String TAG="MemoryUtils.getAppSurplusMe()";        Runtime rt = Runtime.getRuntime();        //一下参数单位为字节数        long totalMemory=rt.totalMemory();//这个是已经申请的内存,等于已经使用的内存加上空闲内存        long maxMemory=rt.maxMemory();//最大内存限制        long freeMemory=rt.freeMemory();        //假如最大内存限制是64M,已经申请了34M,空闲4M,那么其实当前使用的是:(34-4)M,而实际当前有效可使用的内存是:64-(34-4)=34;        //64-(34-4)=34   请允许我引用高数老师的那句话:"同理可得" 64-34+4        //so        long surplusMemory=maxMemory-totalMemory+freeMemory;        Log.d(TAG, "系统当前内存状态: 最大可申请内存:" + rt.maxMemory() / 1024/1024 +"MB 已申请内存:" + rt.totalMemory() / 1024/1024 +  "MB 空闲内存:"+rt.freeMemory()/1024/1024+"MB");        return surplusMemory;    }    /**     * 获得手机可用内存的字节数  这个类不需要try,catch,理论上不会报错     *     * 这个方法要慎用  容易导致崩溃  特别在引导页的时候  低内存手机容易发生崩溃     *     * @param context     * @return     */    public static long getPhoneSurplusMe(Context context)    {        ActivityManager am = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();        am.getMemoryInfo(mi);        return mi.availMem;    }}</span>




更多相关文章

  1. Android中的内存管理机制
  2. Android(安卓)解析包出错问题
  3. Android的致命问题——性能优化
  4. Android(安卓)之旅:Google 发布 Android(安卓)性能优化典范
  5. Android获取ROOT权限的通用方法
  6. android手机安全问题汇总(非技术)
  7. Google送Nexus One手机啦,大家快去收邮件
  8. Android车载方案公司,你该何去何从?
  9. 谷歌无限期推迟Android(安卓)2.1操作平台源代码开放

随机推荐

  1. (4.2.32.2)android热修复之ClassLoader方式
  2. Android实现双击TitleBar回顶部的功能示
  3. CheckBox in ListView
  4. Dialogplus——简单的Android(安卓)dialo
  5. Android添加(创建)、删除及判断是否存在
  6. 详解Android使GridView横向水平滚动的实
  7. emoji表情在web html上显示
  8. Android下载图片到相册
  9. 安卓开发者一定要收藏的网站
  10. Android路由框架AnnoRouter:使用Java接口