使用采样加载图像时出现OutOfMemory错误

时间:2019-05-17 11:21:42

标签: android android-glide android-bitmap bitmapfactory

我正在ImagesRecyclerView的{​​{1}}上显示ImageView,尺寸为50*50。我已经使用了Google提供的指南Guide来使用Scaling等显示位图。此外,我还使用了Glide库来设置Image。示例图像的代码是

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 = 2;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }  

这是DecodeSampleBitmap的代码

public static Bitmap decodeSampledBitmapFromResource(int reqWidth, int reqHeight,byte[] bytes) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inInputShareable=true;
        options.inPurgeable=true;
       // BitmapFactory.decodeResource(res, resId, options);
        BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    }  

这是使用Glide将Image设置为ImageView的代码

BitmapFactory.Options options = new BitmapFactory.Options();
                BitmapFactory.decodeByteArray(imageBytes,0,imageBytes.length,options);
                options.inJustDecodeBounds = true;
                options.inInputShareable=true;
                options.inPurgeable=true;
                int imageHeight = options.outHeight;
                int imageWidth = options.outWidth;
                String imageType = options.outMimeType;
                Drawable d=new BitmapDrawable(getResources(),decodeSampledBitmap(50,50));
                Glide.with(getActivity())
                        .load(d).into(offerBinding.restImg);  

尽管进行了所有这些计算,但总是会加载OutOfMemory error,并且在加载更多图片时应用会崩溃。如何解决呢?

1 个答案:

答案 0 :(得分:0)

对于您的base64StringImageview,请像这样使用它

Glide.with(context)
.load(Base64.decode(base64String, Base64.DEFAULT))
.placeholder(R.drawable.placeholder) // load at start
.error(R.drawable.imagenotfound) // in case of error
.override(50,50)  
.skipMemoryCache(true)
.into(rowImageView);

我希望它能正常工作

相关问题