下面代码讲解 抽象类,无法直接new 2、什么是MutableLiveData MutableLiveData的父类是LiveData 用法和LiveData类似,也是在注册观察者回调里查看更新数据 可变...(下面会贴代码) MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段 4、LiveData的使用 public class UserBean extends...public void setAge(int age) { this.age = age; // postValue(this); // 如果不写的话,单独调用setAge...super.setValue(value); } } 可以看到在MutableLiveData包裹的有setValue,postValue方法 当然我们也可以让它不对外暴露setValue,...postValue() postValue的特性如下: 1.此方法可以在其他线程中调用 2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。
Main3ActivityViewModel(int count) { this.count = count; } } 我们将count类型的变量修改为LiveData的类型 代码如下所示...= new MutableLiveData(); public Main3ActivityViewModel(int count) { this.mCount.setValue... mCount = new MutableLiveData(); public void add() { mCount.setValue(mCount.getValue... score = new MutableLiveData(); public void setScore(int score) { this.score.setValue...在实际项目开发中我们使用switchMap的频率还是很高的,毕竟 只要LiveData对象是调用其他方法获取的 ,我们就可以这样做, 在点击事件中我们设置了可观察数据:分数,当分数改变的时候,就会执行switchMap
observer.mActive) { return; } //再次进行判断,如果是不活跃的,则会更新状态,然后退出 if (!...发送数据 setValue protected void setValue(T value) { assertMainThread("setValue"); mVersion++; //...postTask) {//有待办直接 return return; } //将runnable 扔到主线程执行 ArchTaskExecutor.getInstance...super.postValue(value); } @Override public void setValue(T value) { super.setValue...代码可以参考这里 数据倒灌现象 一般情况下,LiveData 都是存放在 ViewModel 中的,当Activity重建的时候,观察者会被 remove 掉,重建后会添加一个新的观察者,添加后新的观察者版本号就是
对象,它是 LiveData 的子类,然后给它添加观察者对象,代码如下: java: final MutableLiveData simpleLiveData = new MutableLiveData...:LiveData.observe 更新 LiveData 数据:LiveData.setValue 详细介绍 1、Api 介绍 LiveData 是一个带泛型的抽象类,有两个子类 MutableLiveData...它的实现很简单,就是继承了 LiveData 然后向外暴露了 setValue、postValue 方法 MediatorLiveData:它继承自 MutableLiveData 可以监听多个 LiveData...LiveData 结合 ViewModel 使用 前面介绍 LiveData 的使用时都是直接在Activity里使用的,但是真实开发场景中我们一般不直接在 Activity / Fragment 中使用而是在...然后再看 setValue 方法: @MainThread protected void setValue(T value) { assertMainThread("setValue");
04.简单使用LiveData 4.1 单独使用LiveData 举一个最简单的案例代码:liveData = new MutableLiveData(); liveData.observe(this...首先创建一个 MutableLiveData(LiveData是抽象类)对象 ,通过 observe 方法可以订阅修改数据的通知,通过 postValue()或者 setValue() 方法发送事件更新数据...代码如下所示:public class TextViewModel extends ViewModel { /** * LiveData是抽象类,MutableLiveData是具体实现类...MutableLiveData是LiveData的一个子类,从名称上也能看出这个类的作用。 调用setValue()方法就可以把LiveData中的值改为 "小杨真的是一个逗比么" 。...发送源码分析 8.1 setValue源码分析 LiveData 更新数据方式有两个,一个是 setValue() 另一个是 postValue(),这两个方法的区别是,postValue() 在内部会抛到主线程去执行更新数据
如 Activity执行finish方法后,它就不会收到任何LiveData 事件。 不再需要手动处理生命周期。... mutableLiveData = new MutableLiveData(); mutableLiveData.observe(this, new Observer...类将公开 setValue(T) 和 postValue(T) 方法。...以下示例代码说明了如何扩展 LiveData 类。...setValue():注意到value=price这里是调用了setValue(price)方法,通过该方法更新LiveData的值,进而通知处于活跃状态的订阅者。
我们在Log的代码里增加一部分内容比如打印下hashCode再看下执行结果: 2021-11-21 15:22:59.377 27912-27912/com.smart.myapplication V/...遇事不决我们反编译(用jadx直接反编译我们的debug app)一下看看。...但是每次setValue的时候这个值都会加1。...经过一次setValue以后她的值就变成了0。 后续每次observe的时候会创建一个ObserverWrapper。...所以我们上述的代码是不会收到之前的消息的。大家在这里可以试一下 把这个replay改成1,即可复现之前Livedata的问题。
MutableLiveData类暴露公用的setValue(T)和postValue(T)方法,如果需要编辑存储在LiveData对象中的值,必须使用这两个方法。...这个例子展示了点击按钮,setValue()或者postValue()被调用来更新mName,原因有多种,包括响应网络请求或数据库加载完成; 在所有情况下,调用setValue()或postValue(...注意:必须要从主线程调用setValue(T) 方法来更新LiveData 对象. 如果代码在工作线程中执行, 你可以使用postValue(T) 方法来更新LiveData对象....当更新数据库时,会生成所有必要的代码来更新LiveData对象。 生成的代码在需要时在后台线程上异步运行查询。 这种模式对于保持用户界面中显示的数据与存储在数据库中的数据同步很有用。...这样做表示此Observer绑定了Lifecycle对象的生命周期,即: 1.如果Lifecycle对象不处于活动状态,则即使值发生更改,也不会调用Observer。
里加上一个判断,当 LiveData 的值符合某个条件的时候,才做出响应的更新 UI 逻辑,然后提供一个重置 LiveData 值的方法,重置之后,observer 中条件判断为 fasle,因此可以达到不更新...: ViewModel { private val _billLiveData = MutableLiveData() val billLiveData: LiveData<String...Void, to make calls cleaner. */ @MainThread fun call() { setValue(null) }...-> 到账 200 元 // 点击 btn_wait 无输出(实现了事件只被消费一次) 复制代码 缺陷: 由于 setValue() 之后 onChange() 只会回调一次,因此,如果有多个 observer...-> 到账 100 元(没有实现不接收 observe() 之前的事件) // 点击 btn 之后输出 -> 到账 200 元 // 点击 btn_wait 无输出(实现了事件只被消费一次) 复制代码
模式的标准组件之一,不过目前 Google 更多推荐使用 Kotlin Flow 来代替 LiveData; 虽然 LiveData 不再是 Google 主推的组件,但考虑到 LiveData 依然存在于大量存量代码中...MutableLiveData.java public class MutableLiveData extends LiveData { // 异步设置数据 @Override...1、LiveData 只能在主线程更新数据: 只能在主线程 setValue,即使 postValue 内部也是切换到主线程执行; 2、LiveData 数据重放问题: 注册新的订阅者,会重新收到 LiveData...LiveData 实现原理分析 2.1 注册观察者的执行过程 LiveData 支持使用 observe() 或 observeForever() 两种方式注册观察者,其内部会分别包装为 2 种包装对象...将事件名转换为事件接口的方法: DemoEvent.java //可以指定module,若不指定,则使用包名作为module名 @ModuleEvents() public class DemoEvents { //不指定消息类型
用户点击按钮,于是跳转了Detail界面 用户按下返回键,回到列表界面中去 观察者在Activity处于Pause的堆栈中时,会变成不活动状态,返回时,会再次成为活动状态 但此时,观察的值仍然是True...} fun navigateToDetailsHandled() { _navigateToDetails.value = false } } 这种解决方法的问题是,代码中有一些模板代码...另外,如果你有大量的事件,可以使用这个EventObserver来避免一些重复的模板代码。...你可以整合你的代码来更新这些观察者对象中的UI。你的观察者可以在每次应用数据变化(生命周期变化)时更新UI,而不是在每次有变化时更新UI。...你可以在你的代码中定义以下扩展。
onStop()执行时已经变为非活跃状态,此时setValue不会立即回调onChanged方法。...//两个liveData,由liveDataSwitch决定 返回哪个livaData数据 MutableLiveData liveData3 = new MutableLiveData...(); MutableLiveData liveData4 = new MutableLiveData(); //切换条件LiveData,liveDataSwitch...的value 是切换条件 MutableLiveData liveDataSwitch = new MutableLiveData(); //liveDataSwitchMap...> liveData5 = new MutableLiveData(); MutableLiveData liveData6 = new MutableLiveData
又到周末好时光,茫茫人海中,与你在掘金相遇,好幸运~请君赏阅本文,相处不易,开门见山,不扯皮。...如果需要修改LiveData的数据的话,可以通过MutableLiveData来暴露共有方法setValue()和postValue()。...通常在在ViewModel中使用MutableLiveData,而MutableLiveData暴露不可变的LiveData给Observer。...setValue() 注意到value=price这里是调用了setValue(price)方法,通过该方法更新LiveData的值,进而通知处于活跃状态的订阅者。...所以建议各位同学在代码方面的编写一定要有大局观念,代码规范的还是要有,方便别人就是方便自己。不要为应付功能实现而代码臃肿,后续又不重新架构,一直积累成垃圾码。
文能静坐弹吉他,武能通宵写代码。...LiveData 是一个抽象类,其子类常用的有 MutableLiveData, MediatorLiveData 和 RoomTrackingLiveData 。...触发,上面的 mDispatchInvalidated 变为 true,下面 for 循环打断退出,并且重新执行 do- //while 循环,这样就能保证再次分发通知是最新的数据值(...变量主要也是处理并发问题) mDispatchingValue = true; do { mDispatchInvalidated = false;// 默认只会执行一次...if (mActive) { dispatchingValue(this); } } } 3 使用小结 代码不多
当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。...同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner... seekbarValue = new MutableLiveData(); } SeekBarViewModel中存储一个Integer类型的数据。...,使用注解处理器(Annotation Processor)将繁琐的代码自动生成。 首先创建一个类,使用@LiveData注解标记你要保存的数据。注意这里的参数名称,下面会用到。...SeekBarViewModel extends ViewModel { private MutableLiveData mValue; public MutableLiveData
// 别这么做 public class MyViewModel extends AndroidViewModel { public final MutableLiveData...statusLabel = new MutableLiveData(); public SampleViewModel(Application context) {...super(context); statusLabel.setValue(context.getString(R.string.labelString)); } } 复制代码 问题的关键是字符串在构造器中只解释一次...// 显示资源ID public class MyViewModel extends ViewModel { public final MutableLiveData statusLabel...); statusLabel.setValue(R.string.labelString); } } 复制代码 即使你不打算本地化你的应用程序,它也会使测试变得更容易并且清空你的
用户点击按钮,于是跳转了Detail界面 用户按下返回键,回到列表界面中去 观察者在Activity处于Pause的堆栈中时,会变成不活动状态,返回时,会再次成为活动状态 但此时,观察的值仍然是True...fun navigateToDetailsHandled() { _navigateToDetails.value = false } } 这种解决方法的问题是,代码中有一些模板代码...另外,如果你有大量的事件,可以使用这个EventObserver来避免一些重复的模板代码。...你可以整合你的代码来更新这些观察者对象中的UI。你的观察者可以在每次应用数据变化(生命周期变化)时更新UI,而不是在每次有变化时更新UI。...你可以在你的代码中定义以下扩展。
by lazy { MutableLiveData() } 3 val contactsList: MutableLiveDatasetValue()方法。...一旦MutableLiveData所包裹的数据发生变化,我们可以通过postValue()(asynchronously)与setValue()(synchronously)来设置值与发送通知,告诉观察者数据已经改变...同时一旦监听器的回调方法生效时,我们又可以通过LiveData的setValue()来对观察者进行数据的更新。...最后文章中的代码都可以在Github中获取到。
(MutableLiveData) bus.get(target); } public MutableLiveData getChannel(String target...具体代码如下所示://发送消息 LiveDataBus1.get().getChannel("yc\_bus").setValue(text); //接收消息 LiveDataBus1.get().getChannel...() 另一个是 postValue(),这两个方法的区别是,postValue() 在内部会抛到主线程去执行更新数据,因此适合在子线程中使用;而 setValue() 则是直接更新数据。...@MainThread protected void setValue(T value) { assertMainThread("setValue"); // 这里的 mVersion,...而如果在这个 Runnable 执行前多次 postValue,其实只是改变暂存的值 mPendingData,并不会再次抛另一个 Runnable。
removeObserver(this); } } 我们可以看到这里面与LifecycleOwner进行了绑定,并且实现了onStateChanged方法,当生命周期发生变化时执行...//遍历LiveData的所有观察者执行下面代码 for (IteratorsetValue()其实最后就是通过调用了dispatchingValue()方法。...LiveData中的代码很简洁,400多行的代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer时绑定Fragment生命周期...LiveData基于观察者模式实现,并且和LifecycleOwner进行绑定,而LifecycleOwner又被Fragment和Activity实现,所以它可以感知生命周期;在当前的LifecycleOwner不处于活动状态
领取专属 10元无门槛券
手把手带您无忧上云