您的位置:首页 > 文旅 > 美景 > 网站都有哪些类型_建筑室内设计软件_国际外贸网络交易平台_营业推广的方式有哪些

网站都有哪些类型_建筑室内设计软件_国际外贸网络交易平台_营业推广的方式有哪些

2024/10/5 21:20:50 来源:https://blog.csdn.net/li1500742101/article/details/142519220  浏览:    关键词:网站都有哪些类型_建筑室内设计软件_国际外贸网络交易平台_营业推广的方式有哪些
网站都有哪些类型_建筑室内设计软件_国际外贸网络交易平台_营业推广的方式有哪些

前提

LiveData使用了Lifecycle的生命周期,阅读本文前,请先了解Lifecycle源码。

简介

LiveData本质是数据类型,当改变数据的时候,会通知观察者,且只在界面可见的时候才会通知观察者。只能在主线程注册观察者,一般用于更新UI。

具有生命周期属性,生命周期属性来源于Lifecycle的功能。

具有数据粘性,先改变数据,再注册观察者,能收到上一次数据的改变。

使用

普通使用

界面TextView先被改为“我是info1”,1s后改为“在子线程中修改info1”。

界面可见才接收数据

只有在界面可见的时候,观察者才接收数据,中间数据会被丢弃。

执行结果:

先修改数据,后添加观察者,能收到最后一个修改的数据

数据粘性,先修改LiveData数据,再给LiveData添加观察者,该观察者能接收到LiveData最后一次修改的数据。

运行结果:

如何去除粘性?

hook反射 动态修改源码,去除粘性。

源码分析

相关类有LiveData和MutableLiveData,LiveData是抽象类,核心代码在此类中实现。MutableLiveData类是提供给用户使用的,提供修改数据方法。

订阅观察者

订阅观察者的时候,要传入LifecycleOwner对象和Observer对象,在Lifecycle源码分析时,可知LifecycleOwner对象就是Activity。

订阅观察者的时候做了两件事情。

创建Lifecycle的观察者LifecycleBoundObserver,并注册。

存储LiveData观察者用于通知。

修改LiveData数据的时候,如何通知观察者?

主线程修改LiveData数据

主线程修改LiveData数据通知观察者流程,整个过程都在主线程中执行。

子线程修改LiveData数据

子线程修改LiveData数据的时候,首先要使用锁保证value的正确,然后使用Handler切换至主线程,使用主线程修改LiveData数据的方法setValue修改数据。

粘性原理

除了上述流程外,因为使用Lifecycle监听了Activity的生命周期,那么当生命周期回调的时候做了哪些事情?

在订阅观察者的时候,可知Lifecycle的观察者是LifecycleBoundObserver,来监听Activity的生命周期变化。

查看下LifecycleBoundObserver源码如下:

如何去除粘性,使用Hook修改LiveData观察者(ObserverWrapper)的版本和LiveData类的版本(mVersion)相等即可。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com