0

私は過去 3 日間ノンストップでこの「メモリ リーク」と戦ってきました。アプリケーションの他の部分を合理化しましたが、この問題は残っていました。

まず私がやろうとしていること。イメージをファイルに保存するために、 EXTRA_OUTPUT を使用して IMAGE_CAPTURE のインテントを起動しています。次に、返された画像を 2 倍に縮小して表示し、ユーザーに画像の正方形の部分を選択させます。それを選択すると、別のアクティビティに移動し、画像にテキストなどのタグを付けて、最終的に HTTPPost を使用してすべてをサーバーにアップロードします。

今のところ、すべてが一度だけうまく機能します! 私はそれを通過でき、問題なくすべてが機能します。ただし、別の写真を撮ろうとすると、常にメモリ不足の例外が発生します。最新の発生時刻の Logcat は次のとおりです。

02-18 19:07:19.498: ERROR/dalvikvm-heap(6385): 1040400-byte external allocation too large for this process.
02-18 19:07:19.498: ERROR/GraphicsJNI(6385): VM won't let us allocate 1040400 bytes
02-18 19:07:19.498: DEBUG/AndroidRuntime(6385): Shutting down VM
02-18 19:07:19.498: WARN/dalvikvm(6385): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): FATAL EXCEPTION: main
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hitpost/com.hitpost.SharePicture}: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown>
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.os.Looper.loop(Looper.java:123)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at java.lang.reflect.Method.invokeNative(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at java.lang.reflect.Method.invoke(Method.java:521)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at dalvik.system.NativeStart.main(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown>
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.createView(LayoutInflater.java:513)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.Activity.setContentView(Activity.java:1647)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at com.hitpost.SharePicture.onCreate(SharePicture.java:90)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     ... 11 more
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.reflect.InvocationTargetException
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.widget.ImageView.<init>(ImageView.java:108)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at java.lang.reflect.Constructor.constructNative(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.view.LayoutInflater.createView(LayoutInflater.java:500)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     ... 23 more
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.Bitmap.nativeCreate(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     at android.widget.ImageView.<init>(ImageView.java:118)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385):     ... 27 more

最後のアクティビティの setContentView で失敗しています。これは、ユーザーに画像を 1 回表示するが、どういうわけか再度表示できないためです。

私は本当に助けていただければ幸いです!

更新 この問題を複数の電話でテストしてきましたが、これを行っているように見えるのは Froyo を搭載した Nexus One だけです。Samsung Captivate 2.1 で動作し、Moto Milestone 2.1 ではこの問題に関してクラッシュしません。

また、最後に 500 x 500 の画像が必要なので、2 倍以上に縮小することはできません。

4

2 に答える 2

2

BitmapFactory OOMで私の回答を参照してください。

ビットマップ データは、VM ヒープではなく、ネイティブ ヒープにあります。したがって、明示的な VM ガベージ コレクションは効果がありません。

ネイティブ ヒープはガベージ コレクションされますが、あまり頻繁ではなく積極的に収集されます。機能することがわかっている唯一のアプローチは、

  • ネイティブ ヒープを監視して (上記のリンクに従って)、OOM 例外にヒットしないようにします。
  • 不要なときにビットマップを解放します(これにより、ネイティブヒープのスペースが再利用されます)(あなたが行っているように)

    mBitmap.recycle(); mBitmap = null;

于 2011-03-30T22:34:45.130 に答える
0

SoftReferenceメモリが少なくなり、アプリが現在のアクティビティで画像を使用していないときに OS によって再利用されるように、Bitmap オブジェクトをオブジェクトにラップするようにしてください。また、アクティビティが変更されたときにイメージが占有していたメモリを解放することを検討する必要があります。また、その特定のイメージを使用したアクティビティが再開されたときに、ファイルからイメージを再度リロードする必要があります。

于 2011-02-21T23:07:47.453 に答える