有几天,我脑子里有个问题找不到答案。现在我有一个android应用程序,我使用1个片段和一个带有3个片段的视图寻呼机。我想知道的是,这两者的表现有什么不同吗?使用片段会比使用活动提供更少的成本吗?在改变布局时,什么对设备的ram/cpu有好处;从一个活动跳到另一个活动,或者在viewpager的片段之间跳?因为如果我使用活动,每次都会弹出一个窗口。但在viewpager的片段中,我将停留在一个活动中,只更改页面。这会给我提供设备上的性能吗?还是只是一个用户界面问题?
提前谢谢。

最佳答案

viewpager的工作方式是这样的:假设它有n个页面或片段。如果您在索引i上,android将确保片段i-1和i+1及其视图被实例化。当您根据内存和“不保留活动”设置从一个页面到另一个页面时,您将继续实例化片段,直到所有片段都存在于内存中。当你从一边到另一边时,android使用opengl将一个片段的视图平滑地滑到屏幕上,同时将另一个片段滑出。
与其他一些答案相反,当viewpager启动时,android并没有实例化所有片段-实例化是惰性的。除了上面描述的默认行为之外,您还可以使用setOffscreenPageLimit()控制内存使用。
这是与旧的活动堆栈模型的主要区别,后者仅在调用时实例化活动。
有几个后果:
当第一次显示viewpager时,cpu将更加活跃,因为它必须实例化显示的片段和屏幕外的片段(相当于2倍或3倍的工作量)
因为所有的片段都留在内存中,所以内存使用率会(稍微)高一些。如果片段不占用太多内存,那么内存使用量的差异就很小。
如果存在内存压力(或“Do not keep activities”(不保留活动)处于启用状态),则只保留2或3个片段;其他片段将被挂起,因此您需要确保正确实现onSaveInstanceState()。当用户向后滑动时,碎片将被恢复。但是,恢复一个片段比创建等效的新活动占用更少的cpu
一旦片段被实例化,当用户从一边滑到另一边时,cpu的使用将降低,而且(最重要的)ux将更加平滑,因为视图已经存在并呈现在内存中。
使用父活动作为通信中心,片段之间的通信相对容易。
另一点:viewpager的ui隐喻与活动堆栈不同。在权衡采用哪种方法时,除非实现成本极高,否则您可能应该更看重用户体验,而不是实现细节(CPU和内存)。

07-24 09:46
查看更多