この問題に何日も苦労した後、ついにそれを行う方法を見つけました。
Q: 電話の向きを変えるか、Activity を 2 回目に開いて、VM バジェットでアプリケーションを高速化せずに大きなビットマップを表示するにはどうすればよいですか?
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);
Bitmaps を使用した後は、常に bitmap.recycle() メソッドを呼び出します。GC を呼び出すことは解決策ではなく、呼び出される保証はありません。また、recycle メソッドを呼び出さないと、使用後にビットマップが解放されません。
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 予算でのアプリのクラッシュは停止します。