碎片事务.添加与.替换最佳角度?

问题描述 投票:2回答:1

当使用片段事务时,我们可以使用以下方法来完成它们 addreplace 方法。如果我们使用 add,之前的片段不会被销毁,而是保留在内存中。如果我们使用 replace 前一个片段被破坏,当我们返回时又重新创建。从最优(内存、cpu等)的角度来看,什么方法更有效better?

android android-fragments fragment fragmenttransaction
1个回答
3
投票

我创建了一个简单的应用程序,能够替换或添加一个片段,你可以找到它。此处.

根据安卓文档,我已经使用了他们的 工具 来测试性能,这些都是结果。

add

通过添加碎片,CPU的使用率达到了17%的峰值。

replace

通过替换碎片,cpu的使用率达到了23.3%的峰值。


1
投票

如果你说的是内存的使用,那么replace比add要好,因为在add()中,碎片的(在碎片堆栈中的)视图是在内存中的,所有的图像和视图都在占用内存,而内存并没有被释放。假设你有5个片段A、B、C、D、E,你把它们一个一个的添加,A->B->C->D->E现在E在最上面,所有片段A、B、C、D的视图和资源都在内存中加载,假设这些片段有很多重图,那么你的应用有可能面临内存不足。但如果你对每个碎片使用replace,它们的视图就会被释放,所以它们的资源也会被释放(这是好的,因为这些碎片在屏幕上已经不可见了,所以应该不会占用资源、图片和内存)。

更多的信息,谷歌已经介绍了Jetpack导航 https:/developer.android.comguidenavigation。 在这种情况下,当片段从一个导航到另一个时,会进行替换。

在替换的情况下,唯一需要的是你需要正确处理onCreateView(),这样当用户回到被破坏的片段时,它的视图就会再次被填充。


1
投票

这取决于你的方案。一般来说,替换似乎是更好的选择,因为创建一个新的层次结构不会导致性能下降,而且如果你把它保存到你的后堆栈,它可以在不破坏fragment实例的情况下释放它的视图层次结构。然而,有一些情况你应该注意,例如:你创建一个视图,比如地图视图。从头开始创建一个视图需要花费很多时间,所以你应该把这个视图保存在内存中,以防止用户一次又一次地回溯这个片段来创建视图。然而,如果你的内存开始达到它的边界,你应该照顾它,比如通过使用内存回调来销毁该片段。大多数情况下,替换片段是更好的选择。你可以看到,当你把你的片段添加到一个容器中,而不通过不为你的片段设置背景来替换之前的片段时,会发生什么。总结一下,如果你的片段需要这么多时间来创建它的视图层次结构,你可以通过显示和隐藏的事务来保持视图层次结构,而不是把每个片段添加到另一个片段的顶部。但如果片段有一个轻量级的视图层次结构来创建替换它。

© www.soinside.com 2019 - 2024. All rights reserved.