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 回答