1

アプリケーションからダウンロードした画像を使用してバックグラウンドで表示するアプリケーションに取り組んでいます。アプリケーションを起動すると、問題なく動作し、画像をロードできます。しかし、何度か再起動すると、アプリケーションがメモリエラーでクラッシュします。Drawableを取得してViewに表示するには、以下のメソッドを使用します。私は1つのクラスを使用しましたが、この静的メソッドを使用して、すべての画像に使用しています。クリアビットマップのためにもう1つの静的メソッドも呼び出しますが、それが機能するかどうかはわかりません。アプリケーションを閉じるときにメモリをクリアできない可能性があります。

    public static void recycle_bitmap() {
    if (myBitmap != null) {
        myBitmap.recycle();
        myBitmap = null;

    }

    }

    static Bitmap myBitmap = null;

    public static Drawable ImgDrawableFromFile(Resources res, String file_name) {

    myBitmap=null;
    File imgFile = new File("/data/data/com.appstart/app_my_sub_dir/"
            + file_name + ".jpg");
    if (imgFile.exists()) {

        myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
        if (myBitmap != null)
            return new BitmapDrawable(res, myBitmap);
        else
            return null;
    }
    return null;

    }

Logcatエラー

01-11 12:09:41.860: D/dalvikvm(6047): GC_EXTERNAL_ALLOC freed 598K, 48% free                  3336K/6407K, external 8683K/10523K, paused 274ms
01-11 12:09:42.149: E/dalvikvm-heap(6047): 1671840-byte external allocation too large for this process.
01-11 12:09:42.480: I/dalvikvm-heap(6047): Clamp target GC heap from 16.094MB to 16.000MB
01-11 12:09:42.480: E/GraphicsJNI(6047): VM won't let us allocate 1671840 bytes
01-11 12:09:42.501: D/dalvikvm(6047): GC_FOR_MALLOC freed 1K, 48% free 3334K/6407K,    external 8674K/10523K, paused 247ms
01-11 12:09:42.501: D/skia(6047): --- decoder->decode returned false
01-11 12:09:42.501: W/dalvikvm(6047): threadid=15: thread exiting with uncaught exception (group=0x40015560)
01-11 12:09:42.560: E/AndroidRuntime(6047): FATAL EXCEPTION: Thread-18
01-11 12:09:42.560: E/AndroidRuntime(6047): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-11 12:09:42.560: E/AndroidRuntime(6047):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:309)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at com.appstart.utility.LoadImage.ImgDrawableFromFile(LoadImage.java:30)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at com.appstart.MainActivity.run(MainActivity.java:70)
01-11 12:09:42.560: E/AndroidRuntime(6047):     at java.lang.Thread.run(Thread.java:1019)
4

1 に答える 1

1

これらの 3 つのチュートリアルに従って、メモリ エラーを回避します。

メモリ リークを回避する

Android でのメモリ問題への対処

アプリの将来性を保証する

特に、静的変数を使用すると、状況が改善されるどころか悪化する可能性があります。削除して、静的メソッドの外に置いてください。

画像サイズが大きいことが原因である可能性もあります。小さいサイズにスケーリングするか、VM のヒープサイズを増やしてください。

それはあなたを助けるかもしれません。

于 2013-01-11T07:02:13.743 に答える