我正在开发一个应用程序,它将使用一些数据加载~500张图片(在前50个然后listarray将继续向gridview添加项目)。
应用程序即将完成,但刚才我看到它使用了多少内存。我删除了所有内容,看到使用gridview和自定义标题进行简单的mainfragment,使用listview和header的滑动菜单片段使用26兆字节的ram。
经过一番研究,我发现只需要调用这行代码:
View rootView = inflater.inflate(R.layout.main_grid_view, container, false);
将内存使用量增加~10mb,对于主片段和滑动片段,我需要为两个视图充气(一个用于列表视图,一个用于标题视图)。
我可以达到消耗高达60mb(在切换几个类别并加载一些数据之后)(我没有忘记memmory异常,但我想确保没有人会得到它),如果我可以加载listview和gridview标头更有效率,我可以安全地使用大量RAM。
答案 0 :(得分:0)
一种解决方案是手动释放资产onDestroy,然后调用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());
}