2

次の問題に直面しています: アプリが何度か破棄され、再作成されると (たとえば、画面のロックとロック解除によって)、次のエラーでクラッシュします:

02-01 19:24:12.000: E/AndroidRuntime(22362): java.lang.OutOfMemoryError: (Heap Size=62755KB, Allocated=55237KB)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.graphics.Bitmap.nativeCreateScaledBitmap(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:744)

さて、このエラーとその修正方法に関するいくつかの投稿を読みましたが、これまでのところどれも役に立たないようです. 私のアプリで画像を処理する方法は次のとおりです。私のアプリには、次のようなアクティビティが 1 つだけあります。

public class MainActivity extends Activity {

static MenuView mv;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    [...]
    mv = (MenuView) findViewById(R.id.menuview);
    mv.setOnClickListener(new KlickLauscher());
}

public void onDestroy() {
    super.onDestroy();
    mv.destroy(); 
    System.gc();
}

MenuView は次のようになります。

public class MenuView extends View {

MyBitmap button;

public MenuView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public void initialize() {
     button = new MyBitmap("R.drawable.bitmap1");
}

public void onDraw(Canvas c) {
    c.drawBitmap(button.getBmp(),0,0,mPaint);
}   

public void destroy() {
    button.destroy();
}

最後になりましたが、クラス MyBitmap は次のようになります。

class MyBitmap {

Bitmap bmp;

 public MyBitmap(int r) {
  bmp = MyBitmap.createBmp(r);
 }

 public Bitmap getBmp() {
  return bmp;
 }

 static Bitmap createBmp(int r) {
  // Some irrelevant code
  return Bitmap.createScaledBitmap(BitmapFactory.decodeResource(mv.getContext().getResources(),r), width, height, true);
 }

 public void destroy() {
  bmp.recycle();
 }
}

私のアプリのすべてのビットマップは、この MyBitmap クラスを使用して実現され、 onDestroy() が呼び出されると、それらのすべてがリサイクルされます。簡単に言えば、他に何がエラーを引き起こす可能性があるのか​​ 誰か考えていますか?

4

1 に答える 1

0

ここに書かれているように、ビットマップをダウンサンプリングし、必要に応じて正しいビットマップ形式を使用してみてください。

また、コードは実際には 2 つのビットマップを作成すると思うcreateBmpので、使用しないビットマップをリサイクルできます。

そもそもなぜビットマップをスケーリングするのですか? imageView代わりに、スケールするように設定できます。

于 2013-02-02T22:33:47.863 に答える