Android对Bitmap的高效使用总结(Google给的bitmap终极方案)

本文提供了一套通用技术来处理和加载Android中的Bitmap,确保UI线程不被阻塞,并避免出现内存溢出错误。文章详细介绍了从加载到显示的全过程优化方案,包括计算合适的采样率、异步处理图片、使用内存及硬盘缓存等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 概况:

       这个课程给出了处理和加载bitmap的通用技术,能让UI线程不会阻塞,同时防止出现java.lang.OutofMemoryError: bitmap size exceeds VM budget.
  2. 原因:
       A 在Android兼容性定义文档(CDD)3.7章节中,移动设备对单个应用所需的最小内存做了规定。然而,请记住许多设备都被设置了更高的内存限制。
       B 单张图片就常常占用了大量的空间。
       C 很多应用或控件,像ListView,GridView和ViewPager等包含了很多图片。
  3. 从图片的四个阶段(加载,处理,缓存,显示)给出了具体方法:

       A 加载:先只是读取图片的总体信息(BitmapFactory.Options.inJustDecodeBounds = true;),再根据需要读取的数据信息(simapleSize),下面的算法就算采样率。

    public static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
    
            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
    
            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
    
        return inSampleSize;
    }


       B 处理:不在主线程处理图片,包括这些操作:从网络或硬盘读出,对图片的缩放变换处理。
       C 缓存:使用内存缓存(LruCache)和硬盘缓存(DiskLruCache),用放在内存中的Fragment(setRetainInstance(true))解决系统配置发生变化之后是缓存。

       D 显示.

    补充通过:Runtime.getRuntime().maxMemory()

  4. android 各个版本对于bitmap管理的不同:

       A 2.2及其之前会延迟回收,而2.3以后是只要没有引用就及时回收。

       B 2.3.3及其以前,bitmap的像素信息存在native memory。3.0之后是放在java heap。

     2.3.3及其之前用recycle,之后用BitmapFactory.Options.inBitmap

  5.  参考:http://developer.android.com/training/displaying-bitmaps/index.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值