Android-重复碎片事务和电话资源(复杂)



前言-到目前为止,我创建的代码已经提供了所需的用户界面,我的问题是关于电话资源以及是否有"更好"的实现。此外,我对安卓开发相对陌生,可能误解了一些基本概念。

我正在开发一个带有选项卡的应用程序,其中一些选项卡有多个视图。目前,每个视图都由一个片段管理,当用户在选项卡上打开一个新视图时,视图会水平转换。

然而,主选项卡不同——它重新加载自己。该应用程序本质上是一种学习辅助工具;想象一下,每个视图都是一张代表信息的卡片,如果用户在卡片之间翻页。

这是通过让片段管理器分离并重新连接自己的"卡"片段请求来实现的。这是通过调用FragmentActivity中的一个方法来实现的,该方法执行以下内容(从实际代码简化而来):

FragmentTransaction ft = .... .beginTransaction();
ft.setCustomAnimations(int out,int in)
ft.detach(relevantFragment);
ft.attach(relevantFragment);
ft.commit();
.... .executePendingTransaction();

其中,'out'是从XDelta="0"到XDelta="-100%"

并且'in'是从XDelta="100%"到XDelta="0"

因此,旧视图向左滑出,同时新视图从右侧滑入。

这很好,事实上就用户体验而言,这正是我想要的。然而,我们正在重新加载的片段有一个非常复杂的视图层次结构,我对片段的理解是,整个东西将被垃圾收集,并在每次转换时重新实例化,用户在使用应用程序进行研究时可以轻松调用大量(100+)。

我读到的几乎所有内容都表明,我应该避免创建/收集沉重的对象,因为这会导致我的应用程序消耗用户的电池,无论处理器是否足够强大,可以在没有任何视觉滞后的情况下执行。

实际问题:有没有任何方法可以模仿这种行为,而不会在用户点击时每隔几秒钟就迫使手机完全破坏并重新创建视图?

我考虑过的事情:

  1. 消除事务/动画,只需让片段加载新信息。这当然很容易,但不是我的雇主想要的。

  2. 在XML中创建视图层次结构的两个相同副本,并在view.VISIBLE和view.GONE中来回切换,使用自定义ScaleAnimation尝试模拟这种行为。我不确定这是否可行,但乍一看似乎。。。马虎的

  3. 由于手机和/或安卓系统的运行方式,这是一个不必要和/或愚蠢的优化,我不应该担心,我只是没有意识到我在浪费时间。

对于操作系统如何工作的任何建议、建议或说明,我们将不胜感激。

我对片段的理解是,整个东西将被垃圾收集,并在每个转换上重新实例化

如果您查看代码,这是不可能的,至少在片段级别是这样。您并没有放弃Fragment对象,也没有为Android提供一些方法来创建一个全新的相同片段。因此,Fragment将不会被垃圾回收。

可以想象,Android会再次为您的片段调用onCreateView()并丢弃旧视图,尽管这似乎不太可能。您可以通过设置断点或添加日志记录语句来测试这一点。

我读到的几乎所有内容都表明我应该避免创建/收集重物,因为这会导致我的应用程序吞噬用户的电池

肯定做了数百万次。完成"100+"次,它不会"吞噬"电池。也许是Nibble。

我考虑过的事情:

我会专注于#3。最多,以多次调用onCreateView()的形式确定是否确实正在重新创建片段的视图层次结构。如果是,则使用Traceview来确定此操作到底花费了多少时间。

总结上面评论中与CommonsWare的讨论(以及随后对解决问题的方法的调查),这不是一个有效的优化。保留视图层次结构以供重用,而不是允许对其进行销毁和重新创建,只会节省几毫秒的CPU时间。绝大多数都是通过手机对视图的渲染来消耗的,而不是它们的实例化。

CommonWare最初的回答(大部分)是正确的。Fragment.onCreateView()IS在每次附加片段时调用,但没有有效的方法来优化视图渲染。没什么可做的,没什么可担心的。

最新更新