Lifecycle、LifecycleOwner、LifecycleObserver

Lifecycle

Lifecycle是一个抽象类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态。
Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
事件:从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 activity 和 fragment 中的回调事件。
状态:Lifecycle 对象所跟踪的组件的当前状态。

LifecycleRegistry 是 Lifecycle 的实现类

关于生命周期的通知,Lifecycle 并没有采用直接通知的方式,而是采用了 Event(事件) + State(状态) 的设计方式
对于外部生命周期订阅者而言,只需要关注事件 Event 的调用;
而对于Lifecycle而言,其内部只关注 State ,并将生命周期划分为了多个阶段,每个状态又代表了一个事件集,从而对于外部调用者而言,无需拘泥于当前具体的状态是什么。

LifecycleOwner

LifecycleOwner 是只包含一个方法的接口,指明类具有 Lifecycle。它包含一个方法(即 getLifecycle()),该方法必须由类实现。如果您要尝试管理整个应用进程的生命周期,请参阅 ProcessLifecycleOwner。
此接口从各个类(如 Fragment 和 AppCompatActivity)抽象化 Lifecycle 的所有权,并允许编写与这些类搭配使用的组件。任何自定义应用类均可实现 LifecycleOwner 接口。
实现 DefaultLifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为所有者可以提供生命周期,而观测者可以注册以观测生命周期。
FragmentViewLifecycleOwner 继承自 LifecycleOwner

LifecycleOwner 源码,里面唯一的方法是获取 Lifecycle 对象

/**
 * A class that has an Android lifecycle. These events can be used by custom components to
 * handle lifecycle changes without implementing any code inside the Activity or the Fragment.
 *
 * @see Lifecycle
 * @see ViewTreeLifecycleOwner
 */
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

为什么Fragment中要使用viewLifecycleOwner代替this
因为在Fragment中,this绑定到Fragment总体生命周期上,也就是它本身的onCreate和onDestroy这些方法,而viewLifecycleOwner绑定到UI相关的生命周期上,也就是onCreateView和onDestroyView上。
如果使用this,而非viewLifecycleOwner的话,视图销毁了但Fragment本身还没有销毁时,LiveData会继续向观察者发送改变事件,这可能会引起程序崩溃。
Google也推荐我们使用viewLifecycleOwner。

自定义 LifecycleOwner

LifecycleOwner 常用于 viewmodel.livedata.observe(lifecycleOwner) {},如果 lifecycleOwner 持有的 Lifecycle 的生命周期在活跃状态时,数据发生了变化,则会走到后面的回调中。
例如:
自定义 LifecycleOwner,可以自己维护一个生命周期。

class MyCustomLifecycleOwner : LifecycleOwner {
    private val lifecycleRegistry = LifecycleRegistry(this)

    init {
        // 这里可以设置你想要的初始状态
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
    }

    fun onDestroy() {
        // 在Activity的onDestroy中调用此方法以销毁Lifecycle
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}

Activity 中代码

class MainActivity : AppCompatActivity() {
    private val viewModel: MainActivityViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        viewModel.observe(MyCustomLifecycleOwner()) {}
    }

    override fun onDestroy() {
        super.onDestroy()
        customLifecycleOwner?.onDestroy()
    }
}

LifecycleObserver

监听观察组件的生命周期,接口实现:DefaultLifecycleObserver、FullLifecycleObserver

自定义 LifecycleObserver

class MyObserver : DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        connect()
    }

    override fun onPause(owner: LifecycleOwner) {
        disconnect()
    }
}
class MainActivity : AppCompatActivity() {
  
    override fun onCreate(savedInstanceState: Bundle?) {
       MyLifecycleOwner.getLifecycle().addObserver(MyObserver())
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值