前言 - 到目前为止我创建的代码已经提供了所需的用户界面,我的问题是关于电话资源以及是否有“更好”的实现。另外,我对 Android 开发还比较陌生,可能误解了一些基本概念。
我正在开发一个带有选项卡的应用程序,其中一些选项卡有多个 View 。目前,每个 View 都由一个 fragment 管理,当用户位于选项卡上并打开新 View 时, View 会水平过渡。
(该应用程序是现有 iPhone 应用程序到 Android 的移植,虽然我为之工作的人很容易理解使 Android 应用程序尽可能成为 Android 原生的必要性,但他们希望基本的用户界面和控件能够保持不变,因此如果 iPhone 用户购买 Android 手机并购买其应用程序的另一个副本,则不会有根本区别)
但是主选项卡有所不同——它会自行重新加载。该应用程序本质上是一种学习辅助工具;想象一下,每个 View 都是一张代表信息的卡片,用户翻阅卡片。
这是通过让“卡” fragment 请求 fragment 管理器分离然后重新附加自身来完成的。这是通过调用 FragmentActivity 中执行以下内容的方法来完成的(根据实际代码进行了简化):
FragmentTransaction ft = .... .beginTransaction();
ft.setCustomAnimations(int out,int in)
ft.detach(relevantFragment);
ft.attach(relevantFragment);
ft.commit();
.... .executePendingTransaction();
其中“out”是 fromXDelta="0", toXDelta="-100%"
“in”是 fromXDelta="100%", toXDelta="0"
因此,旧 View 向左滑出,同时新 View 从右侧滑入。
这工作得很好,事实上就用户体验而言,这正是我想要的。然而,我们正在重新加载的 fragment 具有极其复杂的 View 层次结构,我对 fragment 的理解是,整个事物将被垃圾收集并在每次转换时重新实例化,用户可以轻松调用使用应用程序学习时多次(100+)。
我读到的几乎所有内容都表明我应该避免繁重的对象创建/收集,因为它会导致我的应用程序消耗用户的电池,无论处理器是否足够强大以在没有任何视觉延迟的情况下执行。
.
实际问题:是否有任何方法可以模拟这种行为,而不会强制手机在用户点击时的每个 View 秒内完全销毁并重新创建 View ?
我考虑过的事情:
消除事务/动画,只需让 fragment 加载新信息。这当然很容易,但不是我的雇主想要的。
在 XML 中创建 View 层次结构的两个相同副本,并在 View.VISIBLE 和 View.GONE 之间来回切换它们,使用自定义 ScaleAnimation 尝试模拟此行为。我不确定这是否可行,但乍一看似乎相当……草率。
由于手机和/或 Android 系统的运行方式,这是一种不必要和/或愚蠢的优化,我不应该担心,而且我根本没有意识到我在浪费时间。
非常感谢任何有关操作系统如何工作的建议、建议或说明。
最佳答案
my understanding of fragments is that the entire thing is going to be garbage collected and re-instantiated on each transition
如果你看看你的代码,这是不可能的,至少在 fragment 级别是不可能的。您不会放弃 Fragment
对象,也不会为 Android 提供一些方法来创建全新的相同 fragment 。因此,Fragment
将不会被垃圾收集。
可以想象,Android 会再次为您的 fragment 调用 onCreateView()
并丢弃旧 View ,尽管这似乎不太可能。您可以通过设置断点或添加日志语句来测试这一点。
Almost all of what I have read indicates I should avoid heavy object creation/collection as it will cause my app to devour an user's battery
绝对完成了数百万次。完成“100+”次,不会“吞噬”电池。也许是一点点。
Things I have considered:
我会专注于#3。最多,以多次调用 onCreateView()
的形式确定 fragment 的 View 层次结构是否确实被重新创建。如果是,则使用 Traceview 来确定此操作到底消耗了多少时间。
关于Android-重复 fragment 交易和手机资源(复杂),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862191/