LiveDate、ViewModel、Activity之间的关系

本文详细探讨了Android中LiveData与Activity的关系,解释了LiveData如何与Activity的生命周期绑定。接着分析了ViewModel与Activity的关联,强调了正确创建ViewModel的重要性。最后,深入解析了ViewModel如何保存和恢复状态,包括其内部的SavedStateHandle机制,以及在Activity特殊状态销毁时如何保持存活。
摘要由CSDN通过智能技术生成

一、LiveDate和Activity的关系 

1、LiveData的通常用法

this,通常传入的是Activity的引用

 liveData.observe(this, object:Observer)

                                                                图1

而ComponentActivity实现了LifecycleOwner接口。 

                                                                图2

observe方法中传入的Observer对象,被包装成了一个LifecycleObserver类型的对象,添加到了

Activity的生命周期观察者的列表里面

最终: LiveData 将 LifeCycleOwener(Activity)和 Observer绑定到了一起。

                                                                        图3

二、ViewModel和Activity的关系。

1、概述

ViewModel和Activity以及Fragment的关联是通过ViewModelProvider,最终还是和Activity或者Fragment的生命周期关联了起来.

2、如何正确的创建一个ViewModel

2.1、错误的方式:

不能使用

                                                图4

的方式实例化 ViewModel。因为这样实例化出来的 ViewModel 不能在屏幕旋转后仍然保持有效;同时也不会使得 ViewModel的onCleared() 方法被回调; 再次,如果使用了 viewModelScope 发起协程的话,也不会使得协程被取消。因为这样创建出来的实例没有被添加到Activity的ViewModeStore中。

                                        图5

在onDestory的时候,调用ViewModelStore的clear()方法。 

 clear()方法遍历了所有的ViewModel,且分别调用了ViewModel的clear()方法。

                                                图6

 

                                        图7

 最终,调用了ViewModel保存的一些Tag对象的的close方法,如viewModelScope或得的

 

                                                                图8

是一个CloseableCoroutineScope,实现了Cloaseable接口。close方法,调用了协助程上下文的cancel()方法。

                                                                图9                

 2.2、正确的创建方式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值