我正在开发一个应用程序,它将加载~500张带有一些数据的图片(首先是50张,然后listarray将继续向gridview添加项目)。
应用程序几乎完成,但刚才我看到了它使用了多少 ram。我删除了所有内容,并看到具有带有网格视图和自定义标头的普通主片段,以及带有列表视图和标头的滑动菜单片段使用 26 兆字节的 ram。
经过一番研究,我发现只需调用这行代码:
View rootView = inflater.inflate(R.layout.main_grid_view, container, false);
将内存使用量增加 ~10mb,对于主片段和滑动片段,我需要膨胀两个视图(一个用于列表视图,一个用于标题视图)。
我可以达到高达60mb的消耗(在切换几个类别并加载一些数据之后)(我没有摆脱记忆异常,但我想确保没有人会得到它),如果我能更有效地加载listview和gridview标头,我可以保护大量的RAM。
一种解决方案是在销毁时手动释放资产,然后调用 GC。您需要拥有所有布局容器的root_view ID。如果您使用的是自定义适配器,则以下方法还对 NPE 具有保护。
unbindDrawables(findViewById(R.id.root_view));
System.gc();
public static void unbindDrawables(View view)
{
if (view.getBackground() != null)
view.getBackground().setCallback(null);
if (view instanceof ImageView)
{
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
else if (view instanceof ViewGroup)
{
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
unbindDrawables(viewGroup.getChildAt(i));
if (!(view instanceof AdapterView))
viewGroup.removeAllViews();
}
if (LOGENABLE)
Log.d("test GC", "Removed all assets for View ID: " + view.getId());
}