Ошибка OutOfMemory при загрузке изображений с использованием выборки - PullRequest
0 голосов
/ 17 мая 2019

Я отображаю Images на RecyclerView в ImageView с размерами как 50*50. Я использовал руководство Guide , данное Google для отображения растровых изображений с использованием масштабирования и т. Д. Вдобавок к руководству я также использовал библиотеку Glide для установки изображения. Код для образца изображения равен

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);
    }  

Это код для установки Image на ImageView с помощью Glide

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 голосов
/ 17 мая 2019

Для вашего base64String до Imageview используйте его вот так

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);

Надеюсь, он будет работать нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...