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



我正在开发一个应用程序,它将加载~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());
}

最新更新