bingoogolapple / bingoogolapple.github.io

个人主页。同时也通过 Issues 记录学习笔记
http://www.bingoogolapple.cn
86 stars 19 forks source link

Android Bitmap 知识点整理 #109

Open bingoogolapple opened 8 years ago

bingoogolapple commented 8 years ago

Android中图片占用内存的计算

Android中一张图片(Bitmap)占用的内存=图片长度 x 图片宽度 x 单位像素占用的字节数 注:图片长度和图片宽度的单位是像素。

创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定。inPreferredConfig为Bitmap.Config类型,它可以为以下值

图片格式(Bitmap.Config) 占用内存的计算方式 一张100*100的图片占用内存的大小
ALPHA_8代表8位Alpha位图 图片长度*图片宽度 100 * 100=10000字节
ARGB_4444代表16位ARGB位图 图片长度图片宽度 \ 2 100 * 100 * 2=20000字节
ARGB_8888代表32位ARGB位图 图片长度图片宽度 \ 4 100 * 100 * 4=40000字节
RGB_565代表8位RGB位图 图片长度图片宽度 \ 2 100 * 100 * 2=20000字节

另外,需要注意这里的图片占用内存是指在Navtive中占用的内存,当然Bitmap使用的绝大多数内存就是该内存。 因为我们可以简单的认为它就是Bitmap所占用的内存。 Bitmap对象在不使用时,我们应该先调用recycle(),然后才它设置为null。 虽然Bitmap在被回收时可以通过BitmapFinalizer来回收内存。但是调用recycle()是一个良好的习惯。 Android 2.3 之前 Bitmap 的引用是放在堆中的,而 Bitmap 的数据部分是放在栈中的,需要用户调用recycle 方法手动进行内存回收,而在 Android 2.3 之后,整个 Bitmap 包括数据和引用都放在了堆中

打印当前程序占用的内存

public static void printMem(String when) {  
    //程序可用的最大内存  
    float maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024;  
    //程序当前占用的内存  
    float totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024;  
    //freeMem != maxMem - totalMem  
    //我理解 freeMem应该是 当前分配给该程序的内存 - totalMem, 当前分配给程序的内存时动态的(在小于maxMem范围内)  
    //同virtualbox安装的ubuntu虚拟机占用内存类似,设置个最大内存,但实际占用内存时动态分配的  
    float freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024;  

    bm(when + ": maxMem | totalMem | freeMem : " + maxMem + "M|" + totalMem + "M|" + freeMem + "M");  
}  
bingoogolapple commented 8 years ago

Android图片下载优化 非常全面的 Android Bitmap 知识点梳理