如果多次使用,Android BitmapFactory.decodeResource内存不足

时间:2014-06-03 13:18:24

标签: android bitmap out-of-memory bitmapfactory

我正在重新编写一个Android应用,其中每个活动(有几个)都会显示背景图片。用户可能会更改此图像,因此我已完成以下操作:

  1. 创建了MyAppApplication(扩展应用程序),在每个活动的onCreate()中设置了一个引用。
  2. MyAppApplication有一个公共的BitmapDrawable,它在开始时应用于后台。
  3. 每个活动都会侦听SharedPreferences中的更改,并根据此类更改重新加载背景图片。
  4. 以下是我用于设置图片的部分代码,基于http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    Bitmap bitmap = decodeBitmap(R.drawable.background_image, screen_width, screen_height);
    }
    public BitmapDrawable backgroundImage = new BitmapDrawable(bitmap);
    
    public Bitmap decodeBitmap(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(getResources(), resId, options);
    
      // Calculate inSampleSize
      options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    
      // Decode bitmap with inSampleSize set
      options.inJustDecodeBounds = false;
      return BitmapFactory.decodeResource(getResources(), resId, options); // crashes here
    }
    

    然后,在活动中,我将背景设置为backgroundImage。

    第一次启动应用程序时,这有效,但如果更改了共享首选项,则应用程序会再次尝试解码资源,并且应用程序会在上面标记的位置崩溃。请问我可以做些什么来避免这种情况?

2 个答案:

答案 0 :(得分:1)

每次使用Bitmap时,都应该释放它们,因为它们占用了大量内存。

在onDestroy()中你应该写一些类似的东西:

bitmap.recycle();
bitmap = null;

每当你停止使用位图时,你也应该调用这些行。

答案 1 :(得分:0)

我接受原始答案,因为将位图设置为null确实是正确的。问题是我把它放在了错误的地方。

读取位图时,应用程序中会发生错误,但这是因为活动中的位图。因此,我必须在每个活动中执行此操作来修复它:

layout.setBackgroundDrawable(null);
layout.setBackgroundDrawable(myApplication.getBackground());