如何在大量视图膨胀时优化RAM使用率

时间:2014-11-20 15:58:17

标签: android gridview memory-management

我正在开发一个应用程序,它将使用一些数据加载~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。

1 个答案:

答案 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());
}