Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid custom view Bitmap memory leak
    primarykey
    data
    text
    <p>I've got a custom view in which I need to draw two bitmaps, one is a background, representing the image of a map and one is a pin which will be drawn on top/left position in canvas. </p> <p>The both images are drawn onDraw and remain the same during the live of the activity that contains the view. After a while I get a </p> <blockquote> <p>OutOfMemoryError: bitmap size exceeds VM budget</p> </blockquote> <p>This means that I have a leak and the bitmaps don't get garbage collected. I asked this question before, but now the situation changed a little. I made a init method where I set the bitmaps I want to use but this still isn't a good approach, the error appears later, but still there.</p> <p>Here is the code</p> <pre><code>public class MyMapView extends View { private int xPos = 0; private int yPos = 0; private int space = 0; private Bitmap resizedBitmap; private Bitmap position; private Bitmap mapBitmap; public void setMapBitmap(Bitmap value) { this.mapBitmap = value; } public MyMapView(Context context) { super(context); } public MyMapView(Context context, AttributeSet attrs) { super(context, attrs); } public MyMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void init(final Context context) { Paint paint = new Paint(); paint.setFilterBitmap(true); int width = getMeasuredWidth(); int height = getMeasuredHeight(); resizedBitmap = Bitmap.createScaledBitmap(mapBitmap, height, height, true); position = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.position); space = (width - resizedBitmap.getWidth()) / 2; } public void destroy() { resizedBitmap.recycle(); resizedBitmap=null; position.recycle(); position=null; mapBitmap.recycle(); mapBitmap=null; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); } @Override protected void onDraw(Canvas canvas) { if (mapBitmap != null) { canvas.drawBitmap(resizedBitmap, space, 0, null); } if (xPos != 0 &amp;&amp; yPos != 0) { canvas.translate(xPos + space - position.getWidth() / 2, yPos - position.getHeight() / 2); canvas.drawBitmap(position, new Matrix(), new Paint()); } } public void updatePosition(int xpos, int ypos) { xPos = xpos; yPos = ypos; invalidate(); } } </code></pre> <p>I call the setMapBitmap() and init() on onCreate of the activity that contains the view. In there I know what bitmap will be used as map. onPause of the activity I call the destroy() of the view. I still get errors. I've read this <a href="http://mobi-solutions.blogspot.com/2010/08/how-to-if-you-want-to-create-and.html">this</a> but I don't know how to adapt it on my case</p> <p>I AM OPEN TO ANY OTHER SOLUTION. Please note that I need to resize the map bitmap (based on the height of the layout that contains it in mai activity) and still be able to draw the position on correct place. </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload