【问题标题】:What should be lifeCycleOwner of LiveData-Fragment or Activity?LiveData-Fragment 或 Activity 的 lifeCycleOwner 应该是什么?
【发布时间】:2021-11-18 21:44:07
【问题描述】:

Activity 会成为 LiveData 的生命周期所有者吗?

Fragment 会成为 LiveData 的生命周期所有者吗?

【问题讨论】:

  • 这取决于您需要这个 LiveData 启动和运行多长时间;你想要它在多个片段中还是一个单独的片段中,以便你可以将它绑定到片段的生命周期。或者你想要它在活动的生命周期中。

标签: android kotlin android-fragments android-activity android-livedata


【解决方案1】:

Google documentation中所述

每个 Fragment 实例都有自己的生命周期。当用户导航并与您的应用交互时,您的片段会在其生命周期中的各种状态中转换,因为它们被添加、移除以及进入或退出屏幕。

所以每个片段和活动都有自己的生命周期。

当您在片段或活动中观察 LiveData 时,您传递与该片段或活动关联的生命周期所有者。

【讨论】:

    【解决方案2】:

    答案是根据我的理解,我会说,这取决于使用或调用 LiveData 的位置?

    让我们了解一些基础知识。

    LifecycleOwner 的定义是指

    具有 Android 生命周期的类。自定义组件可以使用这些事件来处理生命周期更改,而无需在 Activity 或 Fragment 内实现任何代码。

    Lifecycle

    生命周期感知组件执行操作以响应另一个组件生命周期状态的变化,例如活动和片段。这些组件可帮助您生成组织更好、通常更轻量级的代码,更易于维护。

    由于Activity和Fragments的生命周期不同。

    1. Activity - Activity 有自己的生命周期
    2. Fragment - 每个 Fragment 实例都有自己的生命周期。为了管理生命周期,Fragment 实现了 LifecycleOwner。

    Fragment 基本上包含在一个 Activity 中;所以如果Activity被销毁,Fragments也会被销毁。

    但没必要如果fragment被销毁,Activity也会被销毁。

    Live Data

    您可以注册一个与实现 LifecycleOwner 接口的对象配对的观察者。这种关系允许在相应的 Lifecycle 对象的状态更改为 DESTROYED 时移除观察者。

    现在回到你的问题。

    • 在Activity中观察到LiveData时,生命周期的拥有者就是Activity本身。

    • 在 Fragment 中观察到 LiveData 时,生命周期的所有者就是 Fragment 本身。

    【讨论】:

      【解决方案3】:

      LiveData-Fragment 或 Activity 的 lifeCycleOwner 应该是什么?

      这真的取决于你在哪里使用liveDataLiveData 具有生命周期感知能力,这意味着它们尊重 android 应用组件的生命周期。

      如果您使用liveData 观察活动中的数据,那么您应该使用activity 进行观察。

      如果您使用liveData 来观察fragment 中的数据,那么将activity 用作lifecycleOwner 是没有意义的。如果fragment 被替换或删除,使用activity 会导致内存泄漏,因为liveData 仍会持有对该片段的强引用,该片段将一直保留到activity 被销毁。

      我们应该在片段内部使用viewLifecycleOwner,因为它们绑定到片段的生命周期。

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        相关资源
        最近更新 更多