反注册(LiveData的反注册生命周期)

LifecycleBoundObserver 中提供了一个 detachObserver() 方法,只有这个方法里面,会进行生命周期的反注册功能。

@MainThread
public void removeObserver(@NonNull final Observer<? super T> observer) {
//判断如果不是主线程则抛异常
assertMainThread("removeObserver");

//mObservers 是属于这个 LiveData 的观察者集合,需要从集合里删除这个观察者
ObserverWrapper removed = mObservers.remove(observer);
if (removed == null) {
return;
}

//这个 removed 变量的声明是 ObserverWrapper 类型。这是个抽象类,无法实例化。
//实际只能是 AlwaysActiveObserver 或者 LifecycleBoundObserver 两种类型。
//1.如果是 AlwaysActiveObserver 类型,没有重写 detachObserver() 方法。
//因为这是属于 observeForever 的逻辑,永久观察当然不用处于声明周期方面的功能。
//2.如果是 LifecycleBoundObserver 类型,则重写了 detachObserver() 方法。
//用于让 owner 移除这个观察者。
removed.detachObserver();

//因为移除了一个观察者,可能使得 LiveData 的活跃观察者从1变0,所以需要通知一下。
removed.activeStateChanged(false);
}

@SuppressWarnings("WeakerAccess")
@MainThread
public void removeObservers(@NonNull final LifecycleOwner owner) {
assertMainThread("removeObservers");
for (Map.Entry<Observer<? super T>, ObserverWrapper> entry : mObservers) {
if (entry.getValue().isAttachedTo(owner)) {
removeObserver(entry.getKey());
}
}
}

class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull
final LifecycleOwner mOwner;

@Override
void detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
}
这里的 detachObserver() 方法在 LiveData.removeObservers(Observer<T>) 和 LiveData.removeObservers(LifecycleOwner) 中调用的。

LiveData.removeObservers(LifecycleOwner) 内部也是调用的 LiveData.removeObservers(Observer<T>)。让我们先捋清楚 removeObserver(Observer<? super T>) 干了些什么事情。

干得四件事如代码注释所写。

那么 LiveData.removeObservers(Observer<T>) 在什么时候调用呢?

LiveData.removeObservers(Observer<T>) 其实是在接受生命周期回调的 onStateChanged(LifecycleOwner, Lifecycle.Event) 方法中,会判断如果是如果当前 owner 处于 DESTROYED 状态就执行。LiveData 是用的此种方法让它具有了自动反注册功能。下面请看 LiveData 如何接受生命周期事件。
————————————————

原文地址:https://www.cnblogs.com/liyanyan665/p/11379441.html

时间: 2024-11-03 21:49:40

反注册(LiveData的反注册生命周期)的相关文章

服务【启动方式】生命周期 通讯

基本概念 Service通常总是称之为"后台服务",其中"后台"一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: 1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的) 2.具有较长时间的运行特性 服务的两(三)种启动方式 1.startService方式启动服务 最核心的一句话:当Client

Android生命周期 &amp; Activity生命周期

了解Android系统的进程优先级的变化方式 1.Android系统一般是运行在资源受限的硬件平台上,因此资源管理对Android系统很重要 2.为了保证高优先级程序正常运行,可以在无任何警告的情况下终止低优先级程序,并回收其使用的系统资源,因此,Android程序并不能完全控制自身的生命周期,而是由ANdroid系统进行调度和控制的 3.Android系统尽可能地不主动去终止应用程序,即使生命周期结束的程序也会保存在内存中,以便再次快速启动 4.但在内存紧张时,系统会根据进程的优先级清除进程,

注册(LiveData的注册生命周期)

LiveData.java------------------------------ @MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { assertMainThread("observe");(http://www.amjmh.com/v/) if (owner.getLifecycle().getCurrentSt

Android Small插件化框架解读——Activity注册和生命周期[阿里工程师分享]

通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特别是大部分知识都需要结合虚拟机和Androidframwork的原理才能慢慢理解.比如,文中作者提到了插件化框架要解决的三个核心问题: 1)插件类的加载: 2)插件资源的处理: 3)Activity注册和生命周期问题: 其中第3点作者是这样解释的,"大部分插件化框架解决办法都是采用在宿主工程里预先注

drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求、解析、渲染、响应、异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中INSTALLED_APPS注册意义 ,数据库配置

应用是否需要在INSTALLED_APPS中注册 ''' 在没有使用到app的一些特殊操作时(比如数据库相关),不需要app的__init__文件注册时,文件夹可以不用注册,但是注册后,应用的所有功能都能使用 结论:所有应用都可以完成注册 ''' 数据库配置(全部在settings文件中完成即可) import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends

RedGate .NET Reflector注册问题(反注册)

Reflector分为桌面版和VS集成版本,当我们使用注册机注册的时候如果注册了Standvard版本,那么我们的VS就不能集成查看,也不能Debug,那么这 显然不是我们想要的,我们会选择重新注册,但是就遇到无法再次注册,即使卸载也无法注册: 打开这个地址 C:\Users\XXX\AppData\Local\Red Gate\Licenses在这个目录下面有我们注册的文件,删除即可

Activity生命周期方法的调用顺序工程与测试日志

下面为测试activity的方法的执行顺序   工程与测试资源地址 android工程 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.finalizetest"

数据库设计 Step by Step (2)——数据库生命周期

引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整,需要花很多时间整理.思考数据库设计的各种资料,所以文章的更新速度可能会慢一些,也希望大家能够谅解. 系列的第二讲我们将站在高处俯瞰一下数据库的生命周期,了解数据库设计的整体流程 数据库生命周期 大家对软件生命周期较为熟悉,数据库也有其生命周期,如下图所示. 图(1)数据库生命周期 数据库的生命周期

17.(转) Android之四大基本组件介绍与生命周期

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有:M AIN(activity的门户).V