本机应用程序如何处理视图中的大量节点?

时间:2016-06-02 09:15:38

标签: android html ios performance dom

我是一名网络开发人员,当前的问题之一是向单页面应用程序(SPA)迁移以及这带来的挑战。例如,如果我们实现无限滚动,我们可以轻松地找到自己在浏览器中呈现的数百个文档对象模型(DOM)节点。

随后,如果我们需要进行一些将在其中传播的更改,这可能会对我们的表现产生巨大的影响。这就是为什么像React这样的图书馆获得普及的原因 - 虚拟DOM。

Virtual DOM创建整个DOM树的虚拟表示,无论何时进行任何更改,它都会比较旧状态和新状态,并仅更新已更改的节点。 Ionic是一个混合应用程序框架,拥有自己的无限滚动解决方案,可隐藏那些不在视图中的节点,以加快性能。

所以我想知道,本机应用程序如何处理视图中的大量节点?任何带Feed的社交应用都可以在滚动几秒后达到该数字。它是由操作系统处理的吗?这是一个问题吗?

1 个答案:

答案 0 :(得分:1)

如果您不遵守某些最佳做法,这是一个问题。就像异步加载变量图像或尽可能保持布局一样平坦。对于列表视图,使用ViewHolder技术。

Android上的List实现通常不会像提供的数据集中的内容那样实例化尽可能多的视图,但只能在屏幕上显示尽可能多的(和一些额外的)。当视图离开屏幕时,ListView会缓存该实例,并在显示数据集中的新条目时将其提供给您。然后,您只需将模型中的值放在提供的视图中(或者在关联的ViewHolder中更好)并完成它。

如果数据集经常更改或仅仅是巨大的数据集,则可能会出现其他问题。如果数据集中的条目发生更改,那么您可能不想重绘整个ListView,而只想重新创建更改的视图。旧列表实现无法处理此问题。如果某些内容发生变化,则会重新绘制列表中的每个可见视图。像RecyclerView这样的Modern List实现没有这个限制。它不仅强制执行ViewHolder技术,而且还提供方法告诉RecyclerView哪些项目发生了变化,因此它可以提取一些有效的重绘魔法。

如果数据集很大,那么避免内存或性能限制的最佳方法是仅加载数据集中的最新项目并要求用户加载更多项目。或者分页。

所以,是的,在大多数情况下,框架确实对你有帮助。但是有足够的空间搞砸了。