Android 当有大量视图时,如何优化RAM使用

Android 当有大量视图时,如何优化RAM使用,android,gridview,memory-management,Android,Gridview,Memory Management,我正在开发一个应用程序,它将加载约500张图片和一些数据(最初50张,然后listarray将继续向gridview添加项目) 应用程序几乎完成了,但刚才我看到了它使用了多少ram。我剥离了所有内容,看到了带有gridview和自定义标题的普通mainfragment,以及带有listview和标题的滑动菜单fragment使用了26 MB的ram 经过一些研究,我发现只要调用这行代码: View rootView = inflater.inflate(R.layout.main_grid_vi

我正在开发一个应用程序,它将加载约500张图片和一些数据(最初50张,然后listarray将继续向gridview添加项目)

应用程序几乎完成了,但刚才我看到了它使用了多少ram。我剥离了所有内容,看到了带有gridview和自定义标题的普通mainfragment,以及带有listview和标题的滑动菜单fragment使用了26 MB的ram

经过一些研究,我发现只要调用这行代码:

View rootView = inflater.inflate(R.layout.main_grid_view, container, false); 
将内存使用量增加~10mb,对于主片段和滑动片段,我需要膨胀两个视图(一个用于listview,一个用于header视图)


我可以消耗高达60mb的内存(在切换了几个类别并加载了一些数据之后)(我不会排除memmory异常,但我想确保没有人会得到它),如果我可以更高效地加载listview和gridview头,我可以保护大量RAM

一种解决方案是手动在存储上释放资产,然后调用GC。您需要拥有所有版面容器的根视图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());
}
unbindDrawables(findViewById(R.id.root_视图));
gc();
公共静态无效不可绑定绘图(视图)
{
if(view.getBackground()!=null)
view.getBackground().setCallback(null);
if(图像视图的视图实例)
{
ImageView ImageView=(ImageView)视图;
setImageBitmap(空);
}
else if(视图组的视图实例)
{
ViewGroup ViewGroup=(ViewGroup)视图;
对于(int i=0;i
您使用什么来确定这些内存值?除此之外,你的问题不是视图,而是图片。虽然视图并不便宜,但每个视图只有~1KB。位图通常会比这个大很多。我使用的是Android Studio内置的内存监视器。实际上,我可以通过调整位图的大小来适应窗口来处理位图。问题是,在不加载任何位图的情况下,只需初始化我的主片段和导航抽屉的视图,应用程序就会开始使用15mb的ram。打开抽屉后,这个数字会上升到24mb。这正常吗?我的意思是,除了添加片段之外,我什么也不做,也不加载异步任务(实际上不会消耗大量内存)或其他什么。“我使用的是Android Studio内置内存监视器”——这不是特别有用。具体来说,它不处理不再使用但尚未被垃圾收集的对象。在您担心内存监视器的图形告诉您什么之前,先使用MAT并确定具体消耗内存的内容。