1

と言う活動をしています。このアクティビティは画像を表示します。問題は、同じアプリケーション内の前のアクティビティに移動して、それを思い出す場合です。十分な回数行うと、メモリエラーが発生します。アクティビティに戻る/終了するときにそのスペースを解放するようにする方法はありますか?

自動的に解放されると思ったのですが、そうではないのでしょうか? 私がしなければならない電話はありますか?onDestroy(){ image.recycle(); のように } などなど?

ここで何かが起こっていると思います。

例外

10-16 11:50:27.778: E/AndroidRuntime(18255): FATAL EXCEPTION: main
10-16 11:50:27.778: E/AndroidRuntime(18255): java.lang.OutOfMemoryError
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:530)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at com.bentley.cordova.plugins.ZoomImageActivity$1.run(ZoomImageActivity.java:111)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.os.Handler.handleCallback(Handler.java:605)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.os.Looper.loop(Looper.java:137)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at android.app.ActivityThread.main(ActivityThread.java:4697)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at java.lang.reflect.Method.invokeNative(Native Method)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at java.lang.reflect.Method.invoke(Method.java:511)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
10-16 11:50:27.778: E/AndroidRuntime(18255):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

2

私はこの問題を抱えていて、別のstackoverflowユーザーのおかげで解決しました。答えが見つからないので、ここに投稿します。

レイアウトが次のようになっている場合:

<LinearLayout
android:id="@+id/yourcontainer"
...>

more objects

</LinearLayout>

onDestroy メソッドでは、次のようにすべてのドローアブルをバインド解除する必要があります。

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindDrawables(findViewById(R.id.yourcontainer));
}

private void unbindDrawables(View view) {
    if (view == null)
        return;
    if (view.getBackground() != null)
    view.getBackground().setCallback(null);
    if (view instanceof ViewGroup) {
    for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
    }
    try {
        ((ViewGroup) view).removeAllViews();
    } catch (UnsupportedOperationException mayHappen) {
        Log.e("Error:", mayHappen.getMessage());
        }
    }
}
于 2012-10-16T15:43:45.973 に答える