Lifecycle 与LiveData 的讲解
lifecycle
Lifecycle 是生命周期感知型组件,什么是生命感知型组件?就是与Activity 或者Fragment 绑定之后,可执行一些操作来响应Activity和Fragment的生命周期状态的变化。
lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment )的生命周期状态的信息,并且允许其他对象观察此状态。Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:这两个枚举类分别是State和Event。
State:当前生命周期所处状态。有以下状态:CREATED ,STARTED ,RESUMED ,DESTROYED ,INITIALIZED
Event:当前生命周期改变对应的事件。 有以下事件:ON_CREATE ,ON_START ,ON_RESUME ,ON_PAUSE ,ON_STOP ,ON_DESTROY ,ON_ANY ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCzUr0zA-1641547282895)(https://developer.android.com/images/topic/libraries/architecture/lifecycle-states.svg?hl=zh-cn)]
注意这张事件和状态的转换图,它的意思是,从一开始的INITIALIZED 状态,经过了onCreate 事件,也就是Activity 或者Fragment 的onCreate 函数之后,他就变成了CREATED 状态,其他的事件和状态的转换同理。就不一一列举了。
LifecycleObserver 接口( Lifecycle 观察者):实现该接口的类,通过注解的方式,可以通过被LifecycleOwner 类的addObserver(o:LifecycleObserver) 方法注册,被注册后,LifecycleObserver 便可以观察到LifecycleOwner 的生命周期事件。
LifecycleOwner 接口(Lifecycle 持有者):实现该接口的类持有生命周期(Lifecycle 对象),Lifecycle 对象的改变会被其注册的观察者LifecycleObserver 观察到并触发其对应的事件。
通过以上介绍可以知道:实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为LifecycleOwner 可以提供生命周期,而LifecycleObserver 可以注册以便观察组件的生命周期。
LifeCycle 的用法:以官网的定位功能为例
class MyActivity : AppCompatActivity() {
private lateinit var myLocationListener: MyLocationListener
override fun onCreate(...) {
myLocationListener = MyLocationListener(this) { location ->
}
}
public override fun onStart() {
super.onStart()
Util.checkUserStatus { result ->
if (result) {
myLocationListener.start()
}
}
}
public override fun onStop() {
super.onStop()
myLocationListener.stop()
}
}
class MyActivity : AppCompatActivity() {
private lateinit var myLocationListener: MyLocationListener
override fun onCreate(...) {
myLocationListener = MyLocationListener(this, lifecycle) { location ->
}
Util.checkUserStatus { result ->
if (result) {
myLocationListener.enable()
}
}
lifeCycle.addObserver(myLocationListener)
}
}
internal class MyLocationListener(
private val context: Context,
private val lifecycle: Lifecycle,
private val callback: (Location) -> Unit
): LifecycleObserver {
private var enabled = false
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
if (enabled) {
}
}
fun enable() {
enabled = true
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
}
}
来看一下整体的生命周期的调用一个流程,如下图。
ShymanZhu
LifeCycle的作用是让其他组件也可以检测Activity和Fragment生命周期的变化,然后做出相应的响应,并且将Activity的生命周期函数简化。它更大的作用是和其他组件配合使用,比如LiveData。
Livedata
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
如果观察者(由 Observer 类表示)的生命周期处于 STARTED或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。
那么怎么使用LiveData呢?
- 创建
LiveData 的实例以存储某种类型的数据。这通常在 ViewModel 类中完成。 - 创建可定义
onChanged() 方法的 Observer 对象,该方法可以控制当 LiveData 对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象。 - 使用
observe() 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 LifecycleOwner 对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加 Observer 对象。这一步一般是在onCreate中去完成。 - 使用
setValue 或者postValue 的方法去更新LiveDate 里面的值,以便观察者能够感知livedate 发生了变化。
下面是一个例子:
class TestViewModel: ViewModel(){
val userName: MutableLiveData<String> = MutableLiveData()
}
lateinit var testViewModel: TestViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
testViewModel.userName.observe(this){
})
...
}
当更新存储在 LiveData 对象中的值时,它会触发所有已注册的观察者(只要附加的 LifecycleOwner 处于活跃状态)。LiveData 允许界面控制器观察者订阅更新。当 LiveData 对象存储的数据发生更改时,界面会自动更新以做出响应。
来看一下LiveData的源码,它的源码也非常简单。我们直接从setValue开始看
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
void dispatchingValue(@Nullable ObserverWrapper initiator) {
if (mDispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
if (initiator != null) {
considerNotify(initiator);
initiator = null;
} else {
for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispatchInvalidated) {
break;
}
}
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
observer.mObserver.onChanged((T) mData);
}
以上就是LiveData的讲解,这一篇讲解比较基础,以为lifecycle与livedate无论原来还是使用比较简单的,他们配合起来使用确实也比较方便。原理无非就是使用了观察者模式而已。
|