gpt4 book ai didi

android - LifecycleOwner : difference between Fragment (self) and Fragment#viewLifecycle

转载 作者:行者123 更新时间:2023-12-03 22:44:30 24 4
gpt4 key购买 nike

使用 Android XAndroid Architecture Components ,即以下...

  • 导航
  • 生命周期
  • 查看型号

  • ... 使 Android 开发变得更加容易,从而获得更好、更稳定的应用程序。

    使用 ViewModel 时暴露 LiveData s 代表 Fragment ,目前有两个 生命周期所有者 可用于 注意 :
  • Fragment本身或
  • Fragment的属性(property) mViewLifecycleOwner .

  • 到现在为止,我一直都专门使用 Fragment自己为任何和所有 LiveDataViewModel 曝光s。

    由于我喜欢通过经常升级到最新的 alpha 和 beta 来生活在边缘,我最近升级到:
  • 导航ktx版2.2.0-rc01 ;
  • Activity ktx版本1.1.0-rc01 ;
  • fragment ktx版本1.2.0-rc01 ;
  • 生命周期 ktx 版本 2.2.0-rc01 ;

  • 好的,幸运的是,在这个日期(2019 年 11 月 1 日),所有候选版本都可用。

    这导致在旧的 java 代码中警告我:

    enter image description here

    怎么居然有两个 生命周期所有者 ?

    在设置 Fragment 的数据绑定(bind)布局的生命周期所有者(使用 Databinding 库)时,我是否也应该遵循此警告?

    那么 fragment 本身作为 LifecycleOwener 有什么用? ?

    最佳答案

    有两种不同的生命周期,因为 Fragment 本身比 Fragment 的 View 生命周期更长。

    有许多事件会导致 Fragment 的 View 被破坏,但目前仍使 Fragment 本身保持 Activity 状态:

  • 将 Fragment 放在后栈中(即,当您 navigate() 到另一个 Fragment 时)
  • 调用detach()在一个 fragment 上
  • 调用setMaxLifecycle(Lifecycle.State.CREATED)在一个 fragment 上

  • 在这些情况下,Fragment 的 View 被销毁,将 Fragment View 生命周期移动到 DESTROYED。 .但是,Fragment 本身的生命周期是 不是 已销毁 - 它通常保持为 CREATED .这意味着 Fragment 可以经历多个 onCreateView() 的循环。 -> onViewCreated() -> onDestroyView()而只经过 onCreate()一次。

    这成为一个问题的地方是如何 LiveData作品。当你 observe一个 LiveData , LiveData当生命周期到达 DESTROYED 时自动取消注册观察者.但是如果你使用 Fragment 的生命周期来 observeonCreateView()等,该注册观察者在 onDestroyView() 之后仍然存在,尽管 View 被破坏。这意味着您的 Fragment 第二次通过 onCreateView() ,您实际上将创建第二个 Activity 的观察者,两者同时运行。然后下一次是三个观察者,然后继续。

    通过使用 onCreateView() 中的 View LifecycleOwner/ onViewCreated() ,您可以确保一次只运行一个 Activity 的观察者,并且与先前 View 实例相关联的观察者与 View 一起被正确销毁。因此, 是的,您应该始终使用 getViewLifecycleOwner()onCreateView() 中时作为 LifecycleOwner或 onViewCreated() ,包括使用数据绑定(bind)时。

    当然,如果您在 onCreate() 中注册观察员,那么 View LifecycleOwner 还不存在(它是在 onCreateView() 之前创建的)并且您没有多重注册问题,这就是为什么 Lint 检查特别不适用于在 onCreate() 完成的任何注册的原因时间。在这些情况下,使用 Fragment 的生命周期本身是绝对正确的。

    根据 Fragments: Past, Present, and Future talk ,Fragment 的一项 future 改进是将两个生命周期结合在一起,每当 Fragment 的 View 被销毁时总是销毁 Fragment。这在任何已发布的 Fragments、alpha 或其他版本中尚不可用。

    关于android - LifecycleOwner : difference between Fragment (self) and Fragment#viewLifecycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58662901/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com