为什么我没有内存不足的例外?

mml*_*loo 13 android bitmap out-of-memory android-drawable bitmapregiondecoder

我在可绘制文件夹中有一个高分辨率图像(2588*1603).如果我使用下面的代码(1)为imageView设置它我没有得到OOM异常和按预期分配的图像:

public class MainActivity extends ActionBarActivity{


    private ImageView mImageView;

    int mImageHeight = 0;
    int mImageWidth  = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

      mImageView = (ImageView) findViewById(R.id.imageView);
      mImageView.setScaleType(ScaleType.FIT_CENTER);

      BitmapFactory.Options sizeOption = new BitmapFactory.Options();
      sizeOption.inJustDecodeBounds = true;
      BitmapFactory.decodeResource(getResources(), R.drawable.a, sizeOption);
      mImageHeight = sizeOption.outHeight;
      mImageWidth  = sizeOption.outWidth; 

      mImageView.post(new Runnable() {
          @Override
          public void run() {
              try {
                BitmapRegionDecoder bmpDecoder = BitmapRegionDecoder
                          .newInstance(getResources().openRawResource(R.drawable.a),true);
            Rect rect = new Rect(0,0,mImageWidth, mImageHeight);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            options.inDensity = getResources().getDisplayMetrics().densityDpi;
            Bitmap bmp = bmpDecoder.decodeRegion(rect, options);

            mImageView.setImageBitmap(bmp);  

            } catch (NotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }   
          }
      });

    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,rect size与图像大小完全相同.

但如果我使用其他方法,例如2或3,我会得到OOM.

  2)  mImageView.setBackgroundResource(R.drawable.a);

  3) Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.a);
     mImageView.setImageBitmap(bmp);
Run Code Online (Sandbox Code Playgroud)

1和2,3有什么区别?

(我知道如何解决OOM,我只想知道其中的差异)

Nin*_*nja -1

图片的细节过多会导致内存不足。

总结: 1 使用缩放位图;2,3 加载完整详细的可绘制对象(这会导致内存不足),然后调整大小并将其设置为 imageview。

1

Bitmap bmp = bmpDecoder.decodeRegion(rect, options);
Run Code Online (Sandbox Code Playgroud)

构造函数(InputStream is, boolean isShareable)使用stream,不会耗尽内存。

使用 BitmapFactory.Options 和 BitmapRegionDecoder 将缩小位图。

参考:BitmapRegionDecoder 会将其请求的内容绘制到提供的位图中,如果输出内容大小(缩放后)大于提供的位图,则进行裁剪。提供的Bitmap的宽度、高度和Bitmap.Config不会改变

2,3

Drawable d = mContext.getDrawable(mResource);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.a);
Run Code Online (Sandbox Code Playgroud)

没有比例选项,整个图片将加载到内存中

对不起英语。

也许对你有帮助。