我不明白膨胀方法以及此代码如何节省内存

时间:2017-04-29 03:29:39

标签: android android-layout listview

我仍然不明白这段代码。

他们说当ListView没有被使用时,列表视图将被设置为不可见以节省内存。

    // Check if an existing view is being reused, otherwise inflate the view
    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
    }

首先,我不知道膨胀方法的用途。另一方面,当listItemView不可见或未被使用时,看起来上面的代码看起来像, 使ListItemView显示或可见。如果Android应用程序执行此操作,它将显示所有未使用的列表项视图并耗尽所有内存。这与保存记忆的想法相矛盾。

2 个答案:

答案 0 :(得分:2)

上帝,我现在对Android有点生疏,我现在忙于JavaEE和Oracle。好吧,这没什么。

如果我的记忆没有让我失望,那么inflate方法应该解析保存为layout_list_item的UI布局,并从中创建一个实际可以使用的View对象

关于你所听到的......我想你可能会误解。正如你所说,使容器不可见,绝对不会保存任何内存。 Android可能做的是:它创建的容器数量与在屏幕上同时显示的容器一样多,然后在滚动出来时交换它们的内容,以便将它们放在下面并重复使用。例如,只有8到10个容器用于显示ListView内的100个或更多实际项目。你在内存中有大约110个对象而不是200个,我可以看到一些RAM被保存在那里。

这是一个众所周知的良好做法,我非常确定Android并不是唯一利用它的平台。顺便提一句,Angular Material也是这样做的。

答案 1 :(得分:0)

  

首先,我不知道膨胀方法是什么。

inflate()方法读取XML布局文件,并为UI元素创建Java对象以显示在屏幕上。

  

另一方面,它看起来像代码......

我不明白你问题的这一部分。这里发生了两件事

  1. 假设您有一个包含100个项目的列表视图,但只有足够的屏幕空间一次显示10个。 Android只会创建10个可见的视图,这些视图通过不创建所有100个视图来节省内存。

  2. 当用户向下滚动时,Android会重新使用从屏幕底部显示的视图从屏幕顶部消失的视图。换句话说,Android在滚动到屏幕上时不会创建新的视图对象。这减少了垃圾收集器必须执行的工作量,这需要CPU周期。 convertView是重用的视图。如果此引用变量为null,则没有可重用的视图,因此e必须通过膨胀XML布局资源来创建新的视图。

  3. 您提供的代码可能更容易以不同的形式理解:

    View listItemView;
    if (convertView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
    } else {
        listItemView = convertView;
    }
    

    现在我们很清楚我们正在检查给定的convertView是否为空。如果是这样,那么我们必须夸大新视图。如果没有,那么我们可以重用现有的视图。您问题中的原始代码是等效的。