在为这个问题苦苦挣扎了几天之后,我终于找到了解决办法。
Q:如何在不消耗虚拟机预算的情况下通过转动手机或第二次打开Activity来显示一个大的位图?
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2;
bm = BitmapFactory.decodeFile(new File(path));
ImageView imageview =(ImageView)findViewById(R.id.imageView1);
imageview .setImageBitmap(bm);
使用位图后总是调用 bitmap.recycle() 方法。调用GC不是解决办法,不保证会被调用。而且,如果不调用回收方法,位图在使用后不会被释放。
options.inScaled = true;
options.inPurgeable = true;
options.inInputSharable = true;
如果这也不能解决您的问题,请尝试使用 WeakReferences:Bitmap、Bitmap.recycle()、WeakReferences 和 Garbage Collection
如果这也不起作用,那么您的代码中可能存在其他一些内存泄漏。在 Eclipse 中使用 MAT 找出代码中的内存泄漏。
A: 在显示图片之前,您必须先对图片进行一些压缩:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3; // If number equals 3, it is only showing one third of all pixels. May crash if you are using 2, but 2 works in most cases.
Bitmap bMap = BitmapFactory.decodeFile((sdcard/exaple_file)), options);
Drawable d =new BitmapDrawable(bMap);
myLinearLayout.setBackgroundDrawable(d);
在 onPause 中:
@Override
protected void onPause() {
super.onPause();
System.gc();
}
// Some say that you should never call system gc your self, but for me it helps with stability.
这解决了我的问题,但可能不是 100% 最佳的。但它会阻止应用程序在 VM 预算上崩溃。