Android关于加载大图片,产生OOM问题

什么是OOM?

OOM,是OutOfMemory的缩写,翻译过来就是内存溢出。原因是:分配的太少;用的太多;用完没释放。
内存用完没有被释放–>内存泄漏,大量的内存泄漏就导致OOM.
android 在没有利用框架去网络请求加载大图片,容易产生OOM.

  java.lang.RuntimeException: Canvas: trying to draw too large(117608400bytes) bitmap.
        at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
        at android.graphics.Canvas.drawBitmap(Canvas.java:1415)

避免OOM

思路:第一次读取图片,不写入内存,直接获取到图片的宽高,再通过用户设置的控件的宽高,和这個拉伸形式來计算期望的宽高,结合这四個参数來找出最适合的采样率,或者直接根据屏幕大小,控件大小來计算最佳采样率。
什么是采样率?
当采样率为1时,就相当于去下载高清无码原图,如果为3,那么采样率近似于原图的1/3,图片大小也会减小到原来的1/3.
如果我们把采样率写死的话–>BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 10;容易得到下载的图片成AV画质,所以我们下面要学习动态计算采样率,下载图片:

public void getBigImage(View view) {
        ImageView imageView = this.findViewById(R.id.image_container);
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true以后呢,不是真的载入到内存中,只是获取到图片的相关信息
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(),R.mipmap.test_pic,options);
        int width = options.outWidth;
        int height = options.outHeight;
        int measuredWidth = imageView.getMeasuredWidth();
        int measuredHeight = imageView.getMeasuredHeight();
        Log.d(TAG,"width -- > " + width + " measure width -- > " + measuredWidth);
        Log.d(TAG,"height -- > " + height + " measure height -- > " + measuredHeight);
        int sampleSize;
        if(width < measuredWidth || height < measuredHeight) {
            sampleSize = 1;
        } else {
            int subHeight = width / measuredWidth;
            int subWidth = height / measuredHeight;
            sampleSize = subHeight > subWidth ? subHeight : subWidth ;
        }
        Log.d(TAG,"sampleSize -- > " + sampleSize);
        options.inSampleSize = sampleSize;
        //变成false了,真的存入内存
        options.inJustDecodeBounds = false;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.test_pic,options);
        imageView.setImageBitmap(bitmap);
    }

关于图片加载的思路可以去看Volley或okhttp的源码!!!

参考: 阳光沙滩——>拉大锯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值