Sunday, 6 December 2015

XML : Android ImageView XML no leak vs BitmapFactory.decodeResource leak ?

Getting OOM big time in my game UI (I'm only targeting kitkat and above)

I noticed that if I use a android:src="@drawable/empty_screen_game_setup" in XML, leaving and entering the activity always has the same memory usage.

If I DON'T set src in XML, but rather use the following google code, leaving and entering the activity makes the memory usage climb like crazy. This is a test app with no other code because I'm trying to understand the OOM. So much conflicting info out there!!

Is it better to just use src in XML memory-wise? I was hoping to use one set of ressources in no-dpi and scale them to size with bitmapfactory given the screen size but I guess that's not best :(

  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 = 1;        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;  }    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,                                                       int reqWidth, int reqHeight) {        // First decode with inJustDecodeBounds=true to check dimensions      final BitmapFactory.Options options = new BitmapFactory.Options();      options.inJustDecodeBounds = true;      BitmapFactory.decodeResource(res, resId, options);        // Calculate inSampleSize      options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);        // Decode bitmap with inSampleSize set      options.inJustDecodeBounds = false;      return BitmapFactory.decodeResource(res, resId, options);  }    

And in onCreate:

  glass = (ImageView) findViewById(R.id.imageViewGlass);  glass.setImageBitmap( decodeSampledBitmapFromResource(getResources(), R.drawable.empty_screen_game_setup, 500, 300) );    

No comments:

Post a Comment