我遇到了导致我的应用崩溃的一些内存问题。在我的MainActivity上,我在ImageView中有一个大的位图,但是当我在其他也有大位图的活动中时会发生崩溃。
当我将MainActivity转到另一个Activity时,我应该将我的位图设置为null吗?
@Override
protected void onStop() {
super.onStop();
myImageView.setImageBitmap(null);
}
或者我可以依靠Java GC来回收分配的位图内存吗?
答案 0 :(得分:2)
是的,如果你可以在下次重新启动活动时重新加载位图,最好在onStop中回收它。否则GC不会收集它 - 它附加到视图,视图附加到活动,为什么GC会回收它?
答案 1 :(得分:1)
确保将该位图的大小调整为尽可能小的尺寸,以满足您的需要。在每个drawable-?dpi文件夹中部署它并为每个文件夹调整适当的大小非常重要,因此系统不会扩展您已经很大的位图。这种方法解决了我在使用大型图像进行某些View
背景时遇到的内存崩溃问题。
我认为回收位图不会确保GC在第二个活动以大位图开始之前及时释放内存。
答案 2 :(得分:0)
在您调用其他活动之前,请使用finish();
方法。这将关闭当前活动并使资源可用。
答案 3 :(得分:0)
我使用下面的方法递归取消绑定所有视图。您应该传递根视图,然后清除其所有子项。您可以向此方法添加更多内容以回收位图,销毁Web视图,清理侦听器等等!
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
}
}