原因 源码可见只要CompoundButton设置了setOnCheckedChangeListener,就会再每次调用setChecked()的时候再次触发onCheckedChanged。
LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...目前在组件的onCreate()方法中开始观察数据,代码如下所示: 思考下,可以在onResume()中调用么,个人觉得不太好。因为系统会多次调用onResume()方法。...对于onActive方法,当活动观察者的数量从0变为1时调用;对于onInactive方法,当活动观察者的数量从1变为0时调用if (wasInactive && mActive) { onActive...如果这个时候ObserverWrapper的状态是active,就会调用LiveData的dispatchingValue。...LiveData 对同时多次修改数据做了处理,如果同时多次修改,只会修改为最新的数据。
的使用 5、MutableLiveData的使用 6、LiveData和MutableLiveData的可变与不可变 7、其他方法 1、什么是LiveData LiveData是一个观察者模式的数据实体类... 2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。 ...或者Fragment的全部观察者 hasActiveObservers() 如果此LiveData具有活动(Activity或者Fragment在前台,当前屏幕显示)的观察者,则返回true。...其实如果这个数据的观察者在最前台就返回true,否则false。 hasObservers() 如果此LiveData具有观察者,则返回true。...您需要手动调用removeObserver(Observer)以停止观察此LiveData, 2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。
LiveData并不是只运用观察者模式 观察者模式的优点有哪些? 观察者是一种常见并且非常实用的一种行为型模式,具有扩展性强、耦合性低的特性。...注册到被观察者(PlayerActivity)中, 这样Presenter也可以监测到Activity生命周期,并且代码结构没有任何改变,符合开闭原则(对扩展开发 修改关闭) LiveData基于观察者模式又做了哪些扩展...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...liveData值,等回到ActivityA时 你肯定不希望Observer收到多次通知而引发textView多次重绘。...对应的Lifecycle(Activity/Fragment),当页面销毁时会一并结束viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用
LiveData 概述 LiveData 是一个可观察数据包装类,与普通观察者不同,LiveData 具备生命周期感知能力,这意味着它遵循其它应用组件的生命周期(Activity、Fragment、Service...等),此感知能力确保了 LiveData 只更新处于生命周期活跃状态的组件的观察者 生命周期活跃状态的定义是这些组件正处于 STARTED 或 RESUMED 状态,LiveData 只会更新活跃状态的观察者...在生命周期销毁时会立即取消数据观察订阅 LiveData 的优势 确保 UI 和数据状态同步 LiveData 遵循观察者模式。...对象 在大多数情况下,从 app 组件的 onCreate() 方法是开始观察 LiveData 对象最合适,原因如下: onResume() 可能被多次调用,造成 Observer 重复注册 确保...nameObserver) } } nameObserver 作为 observe() 的参数注册之后,一旦 name 发生变动且 MainActivity 处于活跃状态,onChanged() 方法就会被立即调用
LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 2.2 LiveData基于观察者模式又做了哪些扩展?...LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 观察者是一种常见并且非常实用的一种行为型模式,具有扩展性强、耦合性低的特性。...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...liveData值,等回到ActivityA时 你肯定不希望Observer收到多次通知而引发textView多次重绘。...对应的Lifecycle(Activity/Fragment),当页面销毁时会一并结束viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用
——史铁生 前段时间写了java防抖,不过之前写的都是在一定时间内只执行一次,超过这个时间,防抖又失效了,假设我现在有这样一个需求: 在一定的间隔内多次调用一个函数,只有最后一次才生效 例如,我设定的间隔为
使用者不用显示调用反注册方法。LiveData具有生命周期感知能力,所以LiveDataBus只需要调用注册回调方法,而不需要显示的调用反注册方法。...- 2.多次调用了 postValue() 方法,只有最后次调用的值会得到更新。也就是此方法是有可能会丢失事件!...#### 7.2 然后看一下第二个问题 - 首先看一下postValue源代码,如下所示: - 看代码注释中说,如果在多线程中同一个时刻,多次调用了 postValue() 方法,只有最后次调用的值会得到更新...代码如下所示:/\*\* \* 在给定的观察者的生命周期内将给定的观察者添加到观察者列表所有者。 \* 事件是在主线程上分派的。如果LiveData已经有数据集合,它将被传递给观察者。...这意味着给定的观察者将接收所有事件,并且永远不会 被自动删除。 您应该手动调用{@link #removeObserver(Observer)}来停止 观察这LiveData。
class PlayerActivity : BaseActivity{ observers.add(videoPlayer) } 播放器实现ObserverLifecycle接口,并在每个时机调用相应方法...LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 观察者是一种常见并且非常实用的一种行为型模式,具有扩展性强、耦合性低的特性。...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...liveData值,等回到ActivityA时 你肯定不希望Observer收到多次通知而引发textView多次重绘。...对应的Lifecycle(Activity/Fragment),当页面销毁时会一并结束viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用
因此,我们认为LiveData就是一个数据容器,它负责将数据包裹起来,使数据成为被观察者,当数据发生变化时,LiveData会通知观察者以便观察者做出响应。...从上述步骤可以看出,LiveData使用了观察者模式,观察者通常是UI控制器,如Activity或Fragment,而被观察者则是LiveData包谷的数据对象, 当LiveData对象持有数据发生变化...observe() 后,系统会立即调用 onChanged(),从而提供 mCurrentName 中存储的最新值,如果 LiveData 对象尚未在 mCurrentName 中设置值,则不会调用...同时,LiveData仅更新处于活跃生命周期状态的应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态的观察者,那么它是如何做到这一点的呢?...LiveData生命周期变化观察 前面介绍LiveData用法的时候提到,首先,我们创建 LiveData 实例,然后调用LiveData的observe方法来注册观察者,将ViewModel和LiveData
实际使用下来发现 LiveData 有几个特性: LiveData 的实现基于观察者模式; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner...注意:LiveData 对同时多次修改数据做了处理,如果同时多次修改,只会修改为最新的数据。 3. 图解 LiveData 3.1 LiveData 类图 再看一遍类图,回顾一下: ?...知识点汇总 LiveData 的实现基于观察者模式; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner 处于 Active 状态(STARTED...setValue 只不过把操作放到主线程,适合在异步线程里调用,setValue 必须在主线程里调用; 如果同时多次调用 postValue 或 setValue 修改数据,只会修改成最新的那个数据,...总结 LiveData 基于观察者模式,并且可以感知生命周期,这使得我们使用 LiveData 既可以享受观察者模式带来的隔离数据与 UI 等强大的解耦能力,还可以享受感知生命周期带来的巨大便利。
存储的数据,这在有些情况下不符合预期(具体见第 TODO 节); 3、LiveData 不防抖问题: 重复 setValue 相同的值,订阅者会收到多次 onChanged() 回调(可以使用 distinctUntilChanged...LiveData.java // LiveData 持有的版本号 private int mVersion; // 异步设置数据 postValue() 最终也是调用到 setValue() @MainThread...,观察者绑定的生命处于活跃状态,并且 LiveData 存在已设置的旧数据; 2、调用 setValue() / postValue() 设置数据时,观察者绑定的生命周期处于活跃状态; 3、观察者绑定的生命周期由非活跃状态转为活跃状态...2.4 异步设置数据的执行过程 LiveData 使用 postValue() 方法进行异步设置数据(允许在子线程调用),内部会通过一个临时变量 mPendingData 存储数据,再通过 Handler...将切换到主线程并调用 setValue(临时变量)。
onActive()调用时机为:活跃的观察者(LifecycleOwner)数量从 0 变为 1 时。...onInactive()调用时机为:活跃的观察者(LifecycleOwner)数量从 1 变为 0 时。...活跃的观察者数量 由0变为1、由1变为0 会分别调用LiveData的 onActive()、onInactive()方法。这就是前面提到的扩展使用的回调方法。...plug()中让源LiveData调用observeForever方法添加永远观察者-自己。...这里为啥使用observeForever方法呢,这是因为源LiveData在外部使用时不会调用observer方法添加观察者,这里永远观察是为了在源LiveData数据变化时及时回调到 mObserver.onChanged
{ } }) liveData.setVaile("xixi") //子线程调用 liveData.postValue...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...对象没有任何活跃观察者时,会调用 onInactive()方法。...通过改变存储值,来通知到观察者也就是调用onChanged方法。...否则正常通知到观察者的onChanged方法。 当然,如果想任何时候都能监听到,都能获取回调,调用observeForever方法即可。
有一个处于活动状态的观察者时该方法被调用,这意味着需要开始从设备观察位置更新。...vonInactive():当 LiveData 没有任何处于活动状态的观察者时该方法被调用。由于没有观察者在监听,所以没有理由保持与 LocationManager 的连接。...setValue():调用该方法更新 LiveData 实例的值,并将此变更通知给处于活动状态的观察者。...;LiveData user = Transformations.switchMap(userId, id -> getUser(id) ); 使用这些转换允许在整个调用链中携带观察者的 Lifecycle...如果在调用时没有处于活动状态的观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少的资源根据需要惰性运算来创建 LiveData。
LiveData 只会将数据更新给活跃的观察者。 在添加观察者的时候,可以传入 LifecycleOwner 。...添加观察者:observer 调用 observe,传入 LifecycleOwner 和 observer 。...其中: onActive 方法会在活动的观察者从 0 变成 1 的时候调用 onInactive 方法会在活动的观察者从 1 变成 0 的时候调用 添加观察者:observeForever 另外,除了...相关操作 MutableLiveData 由于 LiveData 的发送数据方法是 protected 修饰的,所以不能直接调用。...当没有任何活跃的观察者时,就会调用 onInactive 方法。
而 LiveData 规定了,当我们开发者订阅数据通知(调用observe())时,必须传递相应的 lifecycle 对象,其内部自然就是为了注册相应的观察者,从而做到生命周期感知,不然它怎么能自己解绑呢...对象,然后对外暴漏 LiveData 对象,从而遵循开闭原则,外部调用者只允许订阅观察者,观察数据更新,而不允许主动通知数据更新,当然这也是 LiveData 的标准推荐用法。...) } 在调用 observe() 订阅 Livedata 数据更新时,这里相当于添加了一个观察者,方法内部会将我们传递的 LifecycleOwner 与 观察者 包装为一个具体的生命周期观察者 wrapper...((T) mData); } 让我们总结一下上述的整体思路,当我们调用 setValue() 时,内部会对当前 LiveData 持有的版本号 version 进行自增,然后调用dispatchingValue...问题很简单,在上面我们已经说过了,当我们调用 observe() 添加数据观察者时,内部实际会被包装为 LifecycleBoundObserver,从而添加到 lifecycle 的生命周期观察者列表
主要有如下两个作用: 实时刷新数据 防止内存泄漏 LiveData 采用的是观察者模式,当 LiveData 保存的数据发生变化时就会通知观察者,观察者接收到通知后可以进行 UI 数据刷新或者其他操作。...容器的数据 protected void onActive():当活跃的观察者对象数量大于 0 时调用,即有活跃的观察者对象时调用 protected void onInactive():当活跃的观察者对象数量等于...0 时调用,即无活跃的观察者对象时调用 MutableLiveData:可变的 LiveData,是我们最常用的 LiveData 子类。...,其他状态调用 activeStateChanged 方法去处理是否回调观察者的回调,这样就达到了根据生命周期自动管理观察者的目的。...setValue 方法当前版本 mVersion++,最后则是调用观察者的回调,即我们传入的 Observer 的 onChanged 方法。
LiveData的原理 LiveData的原理非常简单。它使用观察者模式来通知观察者数据发生了变化。当LiveData对象被观察时,它会将观察者添加到观察者列表中。...当LiveData对象发生变化时,它会通知观察者。为了避免内存泄漏,LiveData还需要与生命周期组件一起使用,以确保观察者只会在活动的生命周期内接收数据更新。...当Activity或Fragment处于STARTED或RESUMED状态时,LiveData会将观察者添加到观察者列表中,并开始向观察者发送数据更新通知。...但要注意,使用observeForever()方法需要手动在适当的时机调用removeObserver()方法,否则可能导致内存泄漏。...nameLiveData.observeForever(s -> { // Do something with the updated data }); // 在适当的时机调用removeObserver
Observer LiveData 应用的主要是观察者模式,因为数据是多变的,所以肯定需要观察者来观察。而观察者和数据源建立连接就是通过 observe 方法来实现的。...这样,在 LiveData 里就可以获取到观察者的生命周期了。...当观察者的生命周期可用时,LiveData 会把数据发送给观察者,而当观察者生命周期不可用的时候,即 mOwner.getLifecycle().getCurrentState() == DESTROYED...最后补充一下,LiveData 认为观察者生命周期可用的依据就是在 onStart 调用之后,在 onPause 调用之前。...另外,调用后相应的版本也会自增。最后就是调用 dispatchingValue 方法去分发这个数据 mData 了。
领取专属 10元无门槛券
手把手带您无忧上云