web-dev-qa-db-ja.com

ビットマップのロード中にメモリ不足エラーが発生しました

私はAndroid 3つのアクティビティを持つアプリを持っています:

A1 --開始-> A2 --開始-> A3 --プロセスが終了したとき:開始-> A1

(したがって、アプリを「finish();」しません。ユーザーの操作後ずっと、「startActivity(..);」で次のアクティビティを開始します)

したがって、これら3つのアクティビティにはループがあります。各アクティビティで、SDカードにある3〜9枚の写真を表示します。これは、次の機能でロードします。

try
{
    Uri selectedImageURI = Uri.parse(strImagePath);
    File imgFile = new  File(getRealPathFromURI(selectedImageURI, c));
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    ivTmp.setImageBitmap(myBitmap);
}catch (Exception e)
{
    return null;
}

これはすべて機能します。しかし、時々(私のアクティビティを数回ループした後)、アプリがクラッシュします。

Logcatは私に言います:

01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms
01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation.
01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main
        Java.lang.OutOfMemoryError
        at Android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at Android.graphics.BitmapFactory.decodeStream(BitmapFactory.Java:502)
        at Android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.Java:355)
        at Android.graphics.drawable.Drawable.createFromResourceStream(Drawable.Java:785)
        at Android.content.res.Resources.loadDrawable(Resources.Java:1965)
        at Android.content.res.Resources.getDrawable(Resources.Java:660)
        at Android.widget.ImageView.resolveUri(ImageView.Java:616)
        at Android.widget.ImageView.setImageResource(ImageView.Java:349)
        at <MyApp>.MyActivity$6.run(MyActivity.Java:143)
        at Android.os.Handler.handleCallback(Handler.Java:725)
        at Android.os.Handler.dispatchMessage(Handler.Java:92)
        at Android.os.Looper.loop(Looper.Java:137)
        at Android.app.ActivityThread.main(ActivityThread.Java:5039)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:511)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
        at dalvik.system.NativeStart.main(Native Method)

誰かがクラッシュを処理する方法について私のいくつかのヒントを与えることができますか?アクティビティを正しく閉じるのではなく、「一時停止」と表示するように設定されているためでしょうか。

17
Prexx

すばやく修正するには、追加できます

Android:largeHeap="true"マニフェストアプリケーションタグ内

ここにリンク:

KindleとnookのテーブルでOOMの問題に直面しています

Heap size (large)
Android:largeHeap="true"

より大きなヒープを使用する仕様が記載されています ここにリンク:

編集:キャッシングビットマップ手法を使用 ここにリンク

32
Padma Kumar

高解像度の画像を表示しているときにも同様の問題が発生しました。私はすべてのAndroidビットマップソリューション http://developer.Android.com/training/displaying-bitmaps/index.html および以下で与えられたものを検索して適用しましたリンクにメカニズムをキャッシュしますが、どれも機能しません。適切な解決策はどこにもありません。問題は次のとおりです。描画可能なフォルダ構造を正しく使用できませんでした。mdpiおよびhdpiフォルダに高解像度の画像を保持していました。この原因Android画像を超サイズに拡大します。100kbの画像はAndroidモニター/メモリセクションのおかげで、メモリが20mb増加していました。これらの超解像度画像をxxhdpiフォルダーに追加すると、突然修正されました。その後、画像スライダーが問題なく動作します。

2
smoothumut

これは、画像の解像度が高いため、ビットマップをスケーリングする必要があります。次のコードを使用してください

 Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

    int h = 100; // height in pixels
    int w = 100; // width in pixels
Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true);
ivTmp.setImageBitmap(photoBitMap);
0
Yogesh Tatwal

ええAndroidは、ユーザーに表示されていないアクティビティをすぐに破棄しませんが、現在の状態に応じて呼び出されるライフサイクルメソッドがいくつかあります。チェックアウト http:/ /developer.Android.com/guide/components/activities.html#Lifecycle

OnStop()またはonDestroy()でアクティビティを終了してみてください。これらは、アクティビティが表示されていないときと、システムのメモリが不足しているときに呼び出されます。 :-)

0
Broo