(下一章节介绍MediatorLiveData)
1.1)block代码块中的代码执行时机会执行多次吗? 注释11处,如果当代码块执行之前,是否有取消任务,如果有会把这取消任务给终止掉
多面手MediatorLiveData
image.png
2.1) 用MediatorLiveData监听其他LiveData MediatorLiveData # addSource(LiveData source, Observer<? super S> onChanged) 当sourceLiveData数据有变化后,onChanged这个Observer会的onChange方法会被回调,我们可以在这个回调里选择向MediatorLiveData CoroutinLiveData出场自带所宿主的ViewModel
MediatorLiveData能同时监听多个LiveData的数据变化。
所有这些都是使用MediatorLiveData类编写的。 为了解决这个问题,我应该使用MediatorLiveData来合并Player和Game,如果他们中的任何一个被更新。这将看起来像这样。 MediatorLiveData MediatorLiveData可以转换、过滤和合并其他LiveData实例。每当我创建MediatorLiveData时,我倾向于遵循同样的模式,它看起来像这样。 有时你实际上想更新你的MediatorLiveData,即使一个或多个来源目前是空的,但这是一个很好的方法,在从MediatorLiveData发出新值之前,确保局部变量aVal和bVal不是空的。 你甚至可以在这里应用更多的验证/过滤,以减少你所创建的最终MediatorLiveData的排放。
MediatorLiveData就是LiveData提供的用于组合数据的工具,同时与Transformations类也提供了一些变换工具。 One-to-many dependency — MediatorLiveData MediatorLiveData允许你将一个或多个数据源添加到一个LiveData观察器中。 img 使用MediatorLiveData来组合数据的方法是在不同的方法中添加来源和设置值。 为此使用MediatorLiveData并不理想,因为它要求你在每次需要新数字时都要添加源。 我们不要使用MediatorLiveData,而是尝试(但失败了)用Transformation.map来解决这个问题。
MediatorLiveData 是 LiveData 的子类,允许合并多个 LiveData 源。 只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。 MediatorLiveData<String> mediatorLiveData = new MediatorLiveData<>(); MutableLiveData<String 如果MediatorLiveData有活跃观察者,就调用plug(): //MediatorLiveData.java private static class Source<V> implements 而在e.plug()前是有判断 MediatorLiveData 确认有活跃观察者的。
MediatorLiveData<String> mediatorLiveData = new MediatorLiveData<>(); mediatorLiveData.addSource(liveData1 Observer<String>() { @Override public void onChanged(String s) { mediatorLiveData.setValue (s); } }); mediatorLiveData.addSource(liveData2, new Observer<String>() { @Override public void onChanged(String s) { mediatorLiveData.setValue(s); } }); mediatorLiveData.observe(this, new Observer<String>() { @Override public
MediatorLiveData 继承自 MutableLiveData 可以添加多个 LiveData 数据源,可以观察或调度多个 LiveData 数据源。 前面介绍 Transformations 的变换操作实际上就是返回的 MediatorLiveData ,看一下 MediatorLiveData 的使用: java: MutableLiveData <User> userMediatorLiveData = new MediatorLiveData<>(); userMediatorLiveData.addSource(userLiveData1, 有的人可能会有疑问用 MediatorLiveData 有什么用 ? 的 Observer 自定义LiveData 除了使用库里提供的 MutableLiveData 和 MediatorLiveData 外我们还可以根据实际场景继承 LiveData自定义我们自己的
liveData.setValue(new UserData()); liveData.postValue(new UserData()); MutableLiveData与MediatorLiveData MediatorLiveData:多来源的LiveData 它可以对一个数据结构添加多个数据来源,addSource函数添加LiveData类型的数据来源,而后回调给MediatorLiveData达到多路数据源的效果 = new MutableLiveData<>(); networkData.observe(this, userData -> { // TODO: }); MediatorLiveData <String> live1 = new MediatorLiveData<>(); live1.addSource(localCache, userData -> live1.setValue(userData.getUserName
.; 5LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) ); MediatorLiveData 与LiveData 相关的还有一个MediatorLiveData,它的作用是:可以同时监听多个LiveData。 1LiveData<List<User>> usersFromDatabase; 2LiveData<List<User>> usersFromNetwork; 3MediatorLiveData<List <User>> usersLiveData = 4 new MediatorLiveData<>(); 5usersLiveData.addSource(usersFromDatabase, newUserList 7usersLiveData.addSource(usersFromNetwork, newUserList -> 8 usersLiveData.setValue(value)); 一旦其中一个发送变化,MediatorLiveData
@NonNull LiveData<X> source, @NonNull final Function<X, Y> mapFunction) { final MediatorLiveData <Y> result = new MediatorLiveData<>(); result.addSource(source, new Observer<X>() { result.setValue(mapFunction.apply(x)); } }); return result; } 我们可以看到map的源码是通过MediatorLiveData map()的原理就是基于MediatorLiveData,MediatorLiveData内部会将传递进来的LiveData和Observer封装成内部类,然后放在内部维护的一个Map中。
可以使用 MediatorLiveData 实现自己的转换,MediatorLiveData 是为了用来正确的监听其它 LiveData 实例并处理它们发出的事件而特别创建的。 MediatorLiveData 需要特别注意正确的向源 LiveData 传递其处于活动/闲置状态。有关详细信息,请参阅 Transformations 类。
是在将hasObservers()替换getObserverCount()方法时将LiveData改成了abstract,在此之前它是被定义为public,可以访问外国网站的可以看下这里的修改记录 MediatorLiveData MediatorLiveData可以看成是多个LiveData的代理,当将多个LiveData添加到MediatorLiveData,任何一个LiveData数据发生变化时,MediatorLiveData
合并LiveData 我们可以使用MediatorLiveData类将多个LiveData对象合并为一个LiveData对象。 例如,我们可以将LiveData和LiveData对象合并为LiveData<String, Integer>对象: MediatorLiveData<Pair<String, Integer>> dataLiveData = new MediatorLiveData<>(); dataLiveData.addSource(nameLiveData, s -> { Pair<String, Integer> pair pair = new Pair<>(nameLiveData.getValue(), integer); dataLiveData.setValue(pair); }); 在这个示例中,我们使用MediatorLiveData
要实现自己的转换,您可以使用MediatorLiveData类,该类监听其他LiveData对象并处理它们发出的事件。 MediatorLiveData将其状态正确地传播到源LiveData对象。 合并多个LiveData源 MediatorLiveData是LiveData的一个子类,帮助您合并多个LiveData源。 在任何原始LiveData源对象改变后,MediatorLiveData对象的Observer会被触发。 例如,如果在UI中有一个从本地数据库或网络获取更新的LiveData对象,则可以将以下数据源添加到MediatorLiveData对象: 与存储在数据库中的数据关联的LiveData对象。 您的Activity只需观察MediatorLiveData对象即可接收来自两个数据源的更新。
LiveData 是一个抽象类,其子类常用的有 MutableLiveData, MediatorLiveData 和 RoomTrackingLiveData 。 数据操作方法 public class MutableLiveData<T> extends LiveData<T> {} // 依赖监听其他或多个 LiveData 的变化 public class MediatorLiveData // 一般情况可以忽略该判断 if (wasInactive && mActive) { onActive();// 回调通知,MediatorLiveData mActive) { onInactive();// 回调通知,MediatorLiveData 中有实现 } // 如果从未激活到激活
生命周期销毁的时候,两个 LiveData 的监听关系都会断开,这在 ViewModel 和 Repo 之间也是用 LiveData 通信的场景下,可以有效防止 ViewModel 泄露的问题 一对多的转换 —— MediatorLiveData Transforms 的 map() 和 switchMap() 实际上内部都是用了一个叫 MediatorLiveData 的封装类,使用这个类可以将多个 LiveData 组合起来,实现监听多个 LiveData 变化的功能 image.png 例如上图我们的 Repo 一般都有远程数据和本地缓存,这是一种很常见的场景,这个时候我们可以使用 MediatorLiveData 来监听本地和远程的数据变化 LocalRepo.userData private val remote = RemoteRepo.userData // 共同监听本地和远程数据的变化 private val _result = MediatorLiveData
合并多个LiveData 源 MediatorLiveData是LiveData的子类,它主要用途是用来合并多个LiveData源。 当其中一个源数据发生变化是,都会回调订阅MediatorLiveData的观察者的onChanged()方法。例如我们在实际开发中,我们的数据源要么来自服务器,要么来自本地数据库。 这里就考虑使用MediatorLiveData。
提供基本数据转换方法,例如 switchMap 和 MediatorLiveData。
btn_switchmap.setOnClickListener { model.sendData() } 复制代码 合并两个 Livedata(MediatorLiveData MutableLiveData<String>() private val liveData2 = MutableLiveData<Int>() val liveCombind = MediatorLiveData logEE(it)//model中delay 3s后会返回数据到这里 } emitSource 使用 使用 emitSource 的效果等同于 MediatorLiveData
(MediatorLiveData 用到了 onActive() 跟 onInactive() 有兴趣自行了解,这里不展开) 接下去探索 dispatchingValue 。 4.3 MediatorLiveData LiveData 还有一个子类是 MediatorLiveData,它允许我们合并多个 LiveData,任何一个 LiveData 有更新就会发送通知。 比如我们的数据来源有两个,一个数据库一个网络,这时候我们会有两个 DataSource,也就是两个 LiveData,这个时候我们可以使用 MediatorLiveData 来 merge 这两个 LiveData
LiveData var live1 = MutableLiveData<String>() var live2 = MutableLiveData<String>() var mediator = MediatorLiveData String>() mediator.addSource(live1) { } mediator.addSource(live2){} mediator.observe(this){ } 通过 MediatorLiveData 将两个 MutableLiveData 合并到一起,这样当任何一个发生变化,MediatorLiveData 都可以感知到 相关问题 LiveData 发送的数据是粘性的 例如再没有观察者的时候发送数据