17

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

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)

誰かがクラッシュを処理する方法を教えてくれませんか? アクティビティを正しく閉じるのではなく、「一時停止」状態に設定されているためでしょうか?

4

4 に答える 4

32

迅速な修正のために追加できます

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

ここにリンク:

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

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

ここでは、より大きなヒープリンクを使用するように仕様が言及されています。

編集:キャッシング ビットマップ テクニックを使用するリンクはこちら

于 2013-01-16T13:05:35.960 に答える
0

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

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

于 2013-01-16T13:07:55.190 に答える
0

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

 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);
于 2013-01-16T13:29:54.860 に答える