私は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)
誰かがクラッシュを処理する方法について私のいくつかのヒントを与えることができますか?アクティビティを正しく閉じるのではなく、「一時停止」と表示するように設定されているためでしょうか。
高解像度の画像を表示しているときにも同様の問題が発生しました。私はすべてのAndroidビットマップソリューション http://developer.Android.com/training/displaying-bitmaps/index.html および以下で与えられたものを検索して適用しましたリンクにメカニズムをキャッシュしますが、どれも機能しません。適切な解決策はどこにもありません。問題は次のとおりです。描画可能なフォルダ構造を正しく使用できませんでした。mdpiおよびhdpiフォルダに高解像度の画像を保持していました。この原因Android画像を超サイズに拡大します。100kbの画像はAndroidモニター/メモリセクションのおかげで、メモリが20mb増加していました。これらの超解像度画像をxxhdpiフォルダーに追加すると、突然修正されました。その後、画像スライダーが問題なく動作します。
これは、画像の解像度が高いため、ビットマップをスケーリングする必要があります。次のコードを使用してください
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);
ええAndroidは、ユーザーに表示されていないアクティビティをすぐに破棄しませんが、現在の状態に応じて呼び出されるライフサイクルメソッドがいくつかあります。チェックアウト http:/ /developer.Android.com/guide/components/activities.html#Lifecycle
OnStop()またはonDestroy()でアクティビティを終了してみてください。これらは、アクティビティが表示されていないときと、システムのメモリが不足しているときに呼び出されます。 :-)