没有 UI 的 Fragment 的用例是什么?

What is the use case for a Fragment with no UI?

提问人:Chris Knight 提问时间:7/18/2012 更新时间:12/4/2018 访问量:18118

问:

Android 开发者指南中有一个关于使用 Fragment 的不错部分。使用 Fragment 的一种方法是不带 UI。有一些参考资料将其用作后台处理手段,但 Fragments 为这一领域带来了哪些优势?我在哪里选择使用 Fragment over Threads、AsyncTasks、Handlers 等进行后台处理?

安卓 android-fragments

评论


答:

54赞 Karakuri 7/18/2012 #1

实例可以通过设备配置更改(如屏幕旋转)而保留。由于 将在发生配置更改时销毁并重新创建,因此很难设计一个跟踪线程或 .另一方面,系统负责将持久化重新连接到配置更改的另一端(可以这么说)。您仍然会使用线程或,只是现在 持有它。FragmentActivityAsyncTaskFragmentActivityAsyncTaskFragment

它可能还有其他用途,但我能想到的就是那个。

评论

24赞 BrantApps 7/18/2012
可能应该在 下运行异步任务,以确保在重新创建时不会重新提交同步任务。我们使用一个没有 UI 的片段来充当“控制器”,从其他片段中获取消息(广播)并修改子控件。它提供了一个很好的分离水平,而不会污染父活动代码,确保可移植性和模块化......使用 S 时的一大胜利。app.ServiceFragment
0赞 Greg Ennis 9/1/2014
异步任务绝不应与启动它们的 Activity 相关联。如果用户在异步任务期间导航或返回,会发生什么情况?
2赞 stdout 11/3/2015
更不用说您还需要使用 setRetainInstance 方法。
16赞 Greg Ennis 9/1/2014 #2

我有一大块相当复杂的代码来处理各种社交网络的登录 - Facebook,Google,Twitter。这是我需要在不同活动中重复使用的代码,因为用户可以从应用程序中的不同位置登录。它不属于基活动类,因为您只能从一个类继承,而我将该继承用于其他不相关的功能。

一个没有ui的片段非常适合我的情况,一个片段非常适合我的需求,因为我需要生命周期回调,例如(facebook在这方面是臭名昭著的,需要,例如onActivityResult等)。

评论

0赞 Iwo Banas 9/5/2014
您是从不同的活动访问无 UI 片段的同一实例,还是每个活动都创建自己的片段副本?我认为无 UI 的 fragment 是将大量下载数据从父活动传输到子活动的好方法,但显然每个活动都有自己的片段管理器,这是不可能的。
0赞 Anne Gunn 9/20/2014
@Iwo Banas 中,每个活动都有自己的片段管理器。但是,不同的片段管理器只是在需要时添加并执行相同的片段。
3赞 Anne Gunn 9/20/2014 #3

我同意格雷格·恩尼斯(Greg Ennis)的观点。

我现在正在开发一个应用程序,它必须执行一系列 RESTful API 调用。在大多数情况下,这些只是在单个活动中完成。但是我只是使用了一个无头片段来处理一个情况,即两个不同的活动都需要进行相同的多次调用序列,当然,还要处理序列中任何位置的错误。通过将序列集中在一个片段中,我可以避免重复大量代码。

我们还有另一个 api 调用,它取回了大量数据,这些数据现在正在 UI 线程上解析,并且花费的时间太长。在未来版本的后端 api 中,服务器端将对数据进行分页,我们的应用程序将需要进行一系列 api 调用才能获得完整的结果。我认为这对于保留的无头片段来说是一个很好的应用程序。启动活动可以启动无头片段和调用序列。如果第一次调用没有错误,则该活动可以启动下一个活动以显示初始结果,而片段只是继续运行并要求服务器提供下一页数据。api 调用已在后台线程上完成。我很确定保留的片段必须在自己的工作线程上运行。

有关保留片段的更多信息,请参阅了解 Fragment 的 setRetainInstance(boolean)

3赞 Digvijay Chougale 6/4/2017 #4

这些也称为无头碎片。 您可以在此处阅读更多内容

3赞 Lovekush Vishwakarma 12/4/2018 #5

Headless Fragments 的一个非常有用的功能

Headless Fragments,有一个非常有用的功能 - 它们可以 由 FragmentManager 在配置更改期间保留。因为 他们没有任何与他们相关的 UI,他们不必 当用户旋转设备时,detroyed 并再次重建 例。为了激活此行为,只需将 初始化时 Fragment 的保留标志。这是可以做到的 在 Fragment 的 onCreate 方法中。


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

参考文献 https://luboganev.github.io/blog/headless-fragments/