【问题标题】:What should I do with ImageView when leaving an Activity?离开 Activity 时,ImageView 应该怎么做?
【发布时间】:2013-06-04 08:30:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android memory-management bitmap


    【解决方案1】:

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

    【讨论】:

    • 没有finish() 杀死活动吗?我希望用户能够通过按后退按钮返回 MainActivity,如果 Activity 不再存在,这将不起作用。
    • 确实如此,您可以实现 onBackPressed 方法并使用 finish() 方法在该方法中启动一个意图。然后一次只有一个活动处于活动状态,并且将使用更少的资源
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我使用下面的方法递归地解除绑定所有视图。您应该传递根视图,然后将清除其所有子视图。您可以在此方法中添加更多内容以回收位图、销毁 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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-13
          • 1970-01-01
          • 2018-01-16
          • 2012-11-21
          • 2018-11-30
          相关资源
          最近更新 更多