当前位置: 首页 > news >正文

在青岛建网站品牌网站建设h合肥

在青岛建网站,品牌网站建设h合肥,门户媒体有哪些,你了解网站建设吗 软文案例目录 Livedata定义 Livedata的Obsever方法 Livedata更新数据的两种方式 setValue 1,同步数据 2,分发数据 3,通知观察者 livedata如何避免内存泄漏 livedata中的黏性事件 Livedata定义 Livedata的定义:具有生命感知的可观察…

目录

Livedata定义

Livedata的Obsever方法

Livedata更新数据的两种方式

setValue

1,同步数据

2,分发数据

3,通知观察者

livedata如何避免内存泄漏

 livedata中的黏性事件


Livedata定义

        Livedata的定义:具有生命感知可观察数据持有者,可以感知持有者的生命周期状态,只在持有者活跃时才更新数据

        Livedata的使用非常简单,创建一个Livedata对象,然后调用Observer方法,传入要观察的生命周期对象和自定义的观察者

    val data1 : LiveData<String> = MutableLiveData("hello world")fun test(){data1.observe(this, object : Observer<String>{override fun onChanged(value: String) {}})}

先来看一下他的Observer方法:

Livedata的Obsever方法

       @MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {//检测非主线程报错assertMainThread("observe");//检测owner生命周期if (owner.getLifecycle().getCurrentState() == DESTROYED) {// ignorereturn;}//将生命周期owner和自定义观察者observer包装起来,从而可以监听其生命周期变化LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);//包装好的对象,以我们自定义的的观察者为key,存入一个集合ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);//报错检测机制if (existing != null && !existing.isAttachedTo(owner)) {throw new IllegalArgumentException("Cannot add the same observer"+ " with different lifecycles");}if (existing != null) {return;}//包装后的对象给到LifecycleRegistryowner.getLifecycle().addObserver(wrapper);}

Livedata中有两个关键元素:当前Livedata的版本号mVersion,和当前的观察者集合mObservers

public abstract class LiveData<T> {//每一个LiveData对象有一个mVersion属性,记住这个属性很关键。
private int mVersion;//一个支持迭代时更新数据的Iterable
private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =new SafeIterableMap<>();
}

Livedata更新数据的两种方式

setValue

setValue可以分为三步走:

1,同步数据

@MainThread
protected void setValue(T value) {//主线程检查,非主线程报错assertMainThread("setValue");//版本号+1mVersion++;//更新数据mData = value;//分发数据dispatchingValue(null);
}

2,分发数据

void dispatchingValue(@Nullable ObserverWrapper initiator) {、、省略其他代码
for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {//遍历我们定义的观察者的集合considerNotify(iterator.next().getValue());if (mDispatchInvalidated) {break;}
}、、省略其他代码
}

3,通知观察者

        considerNotify中对observer的状态进行过滤,以及版本进行判断,全部通过后,使用mObserverde的onChanged进行数据回调。

private void considerNotify(ObserverWrapper observer) {if (!observer.mActive) {return;}//生命周期owner至少是STARTEDif (!observer.shouldBeActive()) {observer.activeStateChanged(false);return;}if (observer.mLastVersion >= mVersion) {return;}observer.mLastVersion = mVersion;//这里是我们实现的数据改变后回调方法observer.mObserver.onChanged((T) mData);
}@Override
boolean shouldBeActive() {return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}

livedata如何避免内存泄漏

LiveData 通过与其观察者的 (如 Activity/Fragment)生命周期绑定来实现免内存泄漏。

  1. 当通过 observe(LifecycleOwner, Observer) 方法注册观察者时,LiveData 会将 Observer 和 LifecycleOwner 包装成一个 LifecycleBoundObserver 对象
  2. 这个包装对象实现了LifecycleEventObserver接口,从而能够监听生命周期变化
  3. 当关联的lifecycle对象生命周期变为Destory时,Livedata会自动地将这个观察者从列表中移除,这样就确保了观察者不会因为被 LiveData 持有而阻止了 LifecycleOwner 的被回收,从而避免了内存泄漏。

 livedata中的黏性事件

“黏性事件”是指:当一个新的观察者开始观察 LiveData 时,如果该 LiveData 之前已经设置过值,那么这位新观察者会立即收到最后一次设置的数据(即最新数据)。

当生命周期对象的生命周期变化时,会走一遍事件分发,数据回调流程

这个特性的实现原理主要依赖于一个版本号(mVersion)机制:

  1. 每次通过 setValue() 或 postValue() 更新数据时,mVersion 都会递增。
  2. 每个观察者包装类 (ObserverWrapper) 内部都记录着自己最后一次接收到的数据的版本号 (mLastVersion)。
  3. 当观察者的生命周期变为活跃状态时,LiveData 会检查其 `mLastVersion` 是否小于 LiveData 当前的 mVersion。如果是,就认为这个观察者的数据是“过时的”,便会立即向其分发最新的数据

参考:

LiveData原理面试一问还不懂?

由浅入深,详解 LiveData 的那些事

http://www.dtcms.com/a/522939.html

相关文章:

  • 怎么做婚介网站网站设计实例教程
  • 做个网站多少费用公司网址有哪些
  • 誓做中国最大钓鱼网站广州微信网站建设公司哪家好
  • 网站与微信对接百度公司招聘官网
  • 宁波外贸网站开发唐山的网站建设
  • 网站开发如何找甲方上海网站建设大概多少钱
  • 网站如何做交换链接洛阳网站建设报价
  • 制作网站教学如何创建自己的卡网
  • 网站建设平台简介网站备案如何注销
  • 南通购物网站建设caddy wordpress
  • 做物流的用什么网站配货衡水做网站服务商
  • 小说阅读网站开发设计什么是网站反链
  • 百度不收录网站怎么办深圳市易百讯科技有限公司
  • 学建筑的网站seo工具优化
  • 萝岗公司网站建设网站开发建设公司电话
  • 还原wordpress站点地址恢复河北省建设执业资格注册中心网站
  • 好的外贸网站的特征做网站时连服务器上的数据库
  • 仿魔酷阁网站源码怎样做知道网站
  • 做钓鱼网站网站新备案不能访问
  • 17网站一起做网店广州新塘做网站排在前十名要多少钱
  • 品质好价格低的广告词网站seo优化有哪些方面
  • 繁昌网站建设哪些平台制作网站
  • 专门做衣服的网站哪里有服务好的深圳网站建设
  • 网站数据库连接失败口碑好的句容网站建设
  • 搜狗站长平台主动提交创可贴设计网站官网
  • 做制作网站找啥工作给网站人做网站
  • 南昌网站app开发如何做英文系统下载网站
  • 南宁怎么做网站平面设计素材免费
  • 做国内电影网站赚钱不有没有专业做汽车坐垫网站
  • 网站介绍ppt怎么做网站换dns