Mac*_*ich 8 android android-lifecycle android-fragments android-architecture-components androidx
使用Android X和Android Architecture Components,即以下...
... 使 Android 开发变得更加容易,以获得更好、更稳定的应用程序。
当对 a使用ViewModel公开LiveDatas 时Fragment,目前有两个LifecycleOwners可用于oberve:
Fragment本身或Fragment的财产mViewLifecycleOwner。到目前为止,我一直并且专门将sFragment本身用于任何和所有LiveData由ViewModels公开的内容。
由于我喜欢通过频繁升级到最新的 alpha 和 beta来生活在边缘,我最近升级到:
2.2.0-rc01;1.1.0-rc01;1.2.0-rc01;2.2.0-rc01;幸运的是,在这个日期(2019 年 11 月 1 日),所有可用的候选版本都可用。
这导致在旧的 Java 代码中警告我:
为什么实际上有两个LifecycleOwners?
在设置 Fragment 数据绑定布局的生命周期所有者(使用Databinding库)时,我是否也应该遵循此警告?
那么 Fragment 本身作为一个有LifecycleOwener什么用呢?
ian*_*ake 38
有两个不同的生命周期,因为 Fragment 本身比 Fragment 的视图寿命更长。
有许多事件会导致 Fragment 的视图被销毁,但目前仍保持 Fragment 本身的活动状态:
navigate()到另一个 Fragment 时)detach()片段setMaxLifecycle(Lifecycle.State.CREATED)片段在这些情况下,Fragment 的视图被销毁,将 Fragment 视图生命周期移至DESTROYED. 然而,Fragment 本身的生命周期并没有被销毁——它通常保持为CREATED. 这意味着 Fragment 可以经历多个onCreateView()-> onViewCreated()->循环,onDestroyView()而只经历onCreate()一次。
这成为问题的地方在于它的LiveData工作原理。当您observea 时LiveData,LiveData当生命周期到达时自动取消注册观察者DESTROYED。但是,如果您使用 Fragment 的生命周期observeinonCreateView()等,则该注册的观察者在 之后仍将存在onDestroyView(),尽管视图已被销毁。这意味着您的 Fragment 第二次通过时onCreateView(),您实际上将创建第二个活动观察者,两者同时运行。然后是三个观察者,下一次,如此循环下去。
通过在onCreateView()/ 中使用视图 LifecycleOwner onViewCreated(),您可以确保一次只运行一个活动的观察者,并且与先前视图实例相关的观察者与视图一起正确销毁。因此,是的,您应该始终getViewLifecycleOwner()在onCreateView()或 中用作 LifecycleOwner onViewCreated(),包括在使用数据绑定时。
当然,如果你在 中注册一个观察者onCreate(),那么视图 LifecycleOwner 还不存在(它是在之前创建的onCreateView())并且你没有多重注册问题,这就是为什么 Lint 检查特别不适用于任何onCreate()按时完成注册。在这些情况下,使用 Fragment 的生命周期本身是绝对正确的。
根据Fragments: Past, Present, and Future 谈话,Fragment未来的一项改进是将两个生命周期结合在一起,每当 Fragment 的视图被销毁时,总是销毁 Fragment。这在任何已发布的 Fragments、alpha 或其他版本中尚不可用。
| 归档时间: |
|
| 查看次数: |
3774 次 |
| 最近记录: |