2

我遇到了一些导致我的应用程序崩溃的内存问题。在我的 MainActivity 中,我在 ImageView 中有一个大位图,但是当我在其他也有大位图的活动中时,就会发生崩溃。

当离开我的 MainActivity 去另一个 Activity 时,我应该将我的位图设置为 null 吗?

@Override
protected void onStop() {
    super.onStop();
    myImageView.setImageBitmap(null);
}

或者我可以依靠 Java GC 来回收位图分配的内存吗?

4

4 回答 4

2

是的,如果您可以在下次重新启动活动时重新加载位图,最好在 onStop 中回收它。否则 GC 不会收集它 - 它附加到视图,视图附加到活动,为什么 GC 会回收它?

于 2013-06-07T23:36:17.877 回答
1

确保将该位图的大小调整为仍然可以满足您需要的最小尺寸。同样将其部署在每个 drawable-?dpi 文件夹中并为每个文件夹适当调整大小也很重要,因此系统不会扩大您拥有的已经很大的位图。这种方法解决了我在为某些View背景使用大图像时遇到的内存崩溃问题。

我不认为回收位图将确保 GC 在第二个活动以其大位图/秒开始之前及时释放内存。

于 2013-06-07T23:49:26.407 回答
0

我使用下面的方法递归地取消绑定所有视图。您应该传递根视图,然后将清除其所有子视图。您可以在此方法中添加更多内容以回收位图、销毁 webview、清理侦听器等!

public static void unbindDrawables(View view) {
    try {
        if (view != null) {
            if (view.getBackground() != null) {
                view.getBackground().setCallback(null);
            }
            if (view instanceof ImageView) {
                view.setImageBitmap(null);
            } else if (view instanceof ViewGroup) {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                    unbindDrawables(((ViewGroup) view).getChildAt(i));
                }
                ((ViewGroup) view).removeAllViews();
            }
        }
    }
    catch (Exception e) {
        // some ViewGroups don't support the removeAllViews method
    }
}
于 2013-06-10T12:15:21.907 回答
0

就在您调用其他活动之前,请使用该finish();方法。这将关闭当前活动并使资源可用。

于 2013-06-07T23:09:16.920 回答