Java.lang.OutOfMemoryError at android.graphics.BitmapFactory.decodeResource (BitmapFactory.java data74)

I get OutOfMemoryError while adding a variable background to gridview ... when

final Bitmap shelfBackground = BitmapFactory.decodeResource(resources, background);

Here is my code.

 public class ShelvesView extends GridView { private Bitmap mShelfBackground; private int mShelfWidth; private int mShelfHeight; public ShelvesView(Context context) { super(context); } public ShelvesView(Context context, AttributeSet attrs) { super(context, attrs); load(context, attrs, 0); } public ShelvesView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); load(context, attrs, defStyle); } private void load(Context context, AttributeSet attrs, int defStyle) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ShelvesView, defStyle, 0); int imageWidth = options.outWidth; final Resources resources = getResources(); final int background = a.getResourceId(R.styleable.ShelvesView_shelfBackground, 0); final Bitmap shelfBackground = BitmapFactory.decodeResource(resources, background); if (shelfBackground != null) { mShelfWidth = shelfBackground.getWidth(); mShelfHeight = shelfBackground.getHeight(); mShelfBackground = shelfBackground; } a.recycle(); } @Override protected void dispatchDraw(Canvas canvas) { final int count = getChildCount(); final int top = count > 0 ? getChildAt(0).getTop() : 0; final int shelfWidth = mShelfWidth; final int shelfHeight = mShelfHeight; final int width = getWidth(); final int height = getHeight(); int bottom = (count > 0) ? getChildAt(count - 5).getBottom() + shelfHeight : 0; final Bitmap background = mShelfBackground; for (int x = 0; x < width; x += shelfWidth) { for (int y = top; y < height; y += shelfHeight) { canvas.drawBitmap(background, x, y, null); } } //drawDecorations(canvas, top, shelfHeight, width); // canvas.drawBitmap(mShelfLeftLayer,0,bottom, null); super.dispatchDraw(canvas); } } 
+4
source share
3 answers

Add Bitmap option to it -

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; shelfBackground = BitmapFactory.decodeResource(resources, background, options); 
+4
source

Use the example from the Android SDK to process images from the user interface stream:

 class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private int data = 0; public BitmapWorkerTask(ImageView imageView) { // Use a WeakReference to ensure the ImageView can be garbage collected imageViewReference = new WeakReference<ImageView>(imageView); } // Decode image in background. @Override protected Bitmap doInBackground(Integer... params) { data = params[0]; return decodeSampledBitmapFromResource(getResources(), data, 100, 100)); } // Once complete, see if ImageView is still around and set bitmap. @Override protected void onPostExecute(Bitmap bitmap) { if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); } } } 

}

Here you can find more examples for decoding using sampleSize decodeResource .

+2
source

You can use the BitmapFactory.Options class to crop the image to any size.

You can use the following:

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inSampleSize = 8; // 1/8th of actual image. BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; 

For more information, see this .

Here, when you use Bitmap , always call its bmp.recycle() method, since the GC cannot clear the memory stored in Bitmap , if your bitmap does not receive garbage collection, then you also get OME .

I also gave a general solution, see.

+1
source

Source: https://habr.com/ru/post/1436307/


All Articles