2

こんにちは私がアクティビティAをアクティビティBに呼び出すときを言いましょう

以下は私のコードになります

     Intent i = new Intent(TemplateList.this, PictureEditor.class);
     Bundle b = new Bundle();
     b.putString("Key", "2");
     b.putString("Index", imagepathString);
     i.putExtras(b);
     v.getContext().startActivity(i);
     System.gc();
     Runtime.getRuntime().gc();
     finish();

アクティビティAのために、非常に多くのオブジェクト(非常に多くの画像)がロードされているため、System.gc()によってすべてのオブジェクトをクリアしています。Runtime.getRuntime()。gc(); クリアされ、アクティビティも破棄されるため、オブジェクトが割り当てられたままになることはありません:)

アクティビティBからアクティビティAに電話します

        btnTemplate.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(PictureEditor.this, TemplateList.class));
            dg.dismiss();
            if (bmp != null) {
                bmp.recycle();
                bmp = null;
            }
            System.gc();
            Runtime.getRuntime().gc();
            finish();
        }
    });

//ここでも、アクティビティを呼び出しSystem.gcて破棄しますが、開始する場合は、取得するよりもRuntime.getRuntime.gc理由がわかりませんactivity A

以下のエラー

     12-19 12:44:48.769: E/AndroidRuntime(7539): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405)
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at com.redwood.PictureEditor.get_bitmap(PictureEditor.java:257)
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at com.redwood.PictureEditor$5.run(PictureEditor.java:218)
     12-19 12:44:48.769: E/AndroidRuntime(7539):    at java.lang.Thread.run(Thread.java:1019)

どんな体でも私の問題を解決できますか:(

4

3 に答える 3

2

System.gc();またはを手動で呼び出すことは決して良い習慣ではありませんRuntime.getRuntime().gc();inSampleSizeより良いオプションは、またはを使用して画面サイズに応じて画像のサイズを変更/拡大縮小することscaledBitmap()です。ここで私の答えを確認できます。これにより、画像をメモリにロードする前に、画像のサイズを変更/拡大縮小する方法がわかります。

于 2012-12-19T07:47:30.050 に答える
2

これらのメソッドを呼び出すことは機能しません。これらのメソッドは、GCに「必要に応じて今すぐ実行できる」と言うだけです。

基本的にこれらの問題を探します。

  • ビットマップが大きすぎませんか?->アプリで必要な最小サイズに再スケーリングします。
  • ビットマップをコピーしすぎていませんか?
  • アクティビティBのコンテキストをリークして、ビットマップをリークしていませんか?

それは多くの場所から来る可能性がありますが、私は最初にあなたのアプリで必要な最小サイズにそれを縮小しようとします。

于 2012-12-19T07:50:27.627 に答える
1

画像を縮小してみてくださいこれを使用できます

public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
    int width = image.getWidth();
    int height = image.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
            matrix, false);
    return resizedBitmap;
}

ここから、取得する画像のサイズを計算できます

于 2012-12-19T07:50:45.037 に答える