; 在 ViewModel 中使用了 LiveData 后 , 先调用 LiveData#observe 函数 为 LiveData 设置 androidx.lifecycle.Observer 监听器...使用要点 在 Activity 组件中 , 通过调用 ViewModel 视图模型获取 数据库中的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository...调用 Room 框架的相关方法操作 SQLite 数据库 ; 首先 , 获取 ViewModel 视图模型 ; // 获取 ViewModel 视图模型对象 var viewModel...}) 最后 , 通过调用 ViewModel 中定义的 数据库操作 方法 , 修改数据库中的数据 , 如果数据库中的数据发生了改变 , 就会自动回调 Observer#onChanged 方法 ; thread...viewModel.query().observe(this, object: Observer> { override fun onChanged(
一般情况下LiveData都是搭配这ViewModel使用,这里先介绍一下LiveData,再结合ViewModel使用 Android数据绑定技术一,企业级开发 Android数据绑定技术二,企业级开发...activity中使用 myViewModel.getmStr().observe(this, new Observer() { @Override public void onChanged... 2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。 ...3.如果同时调用 .postValue()和.setValue(),结果是post的值覆盖set值。...setValue() setValue()的特性如下: 1.此方法只能在主线程里调用 getValue() 返回当前值。 注意,在后台线程上调用此方法并不能保证将接收到最新的值。
官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。...ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,在配置更改期间保留在内存中,系统会自动将 ViewModel 与发生配置更改后产生的新 Activity 实例相关联。...在分发事件的时会先判断mVersion 和mLastVersion,当mLastVersion onChanged((T) mData);进行分发。...return; } // 第三处 observer.mLastVersion = mVersion; observer.mObserver.onChanged...但是Activity重建后会调用LiveData的observe()方法,方法内部会重新new一个实例,会将mLastVersion恢复到初始值。
,但是后患无穷,并且View和ViewModel之前只能是单项的,即只能View层持有ViewModel,那么如何优雅的实现找那个需求呢?...public Main3ActivityViewModel(int count) { this.mCount.setValue(count); } } 这样的话 我们在WorkUtil中调用...add方法 就可以改变mCount的值了,最后我们在注册回到的onChanged方法中去给Textview赋值就可以了,我们运行程序结果如下: ?...嚯嚯,pia pia 打脸 这里报错的原因是因为我们的计数demo是运行在子线程中的,而LiveData的setValue方法只能在主线程中调用,如果想要在子线程中调动只能使用postValue方法,我们将赋值方法改为...在实际项目开发中我们使用switchMap的频率还是很高的,毕竟 只要LiveData对象是调用其他方法获取的 ,我们就可以这样做, 在点击事件中我们设置了可观察数据:分数,当分数改变的时候,就会执行switchMap
二、 LiveData与ViewModel的关系 在Jetpack架构中,ViewModel的主要作用是存储各种数据,当然,我们也可以在ViewModel中处理一些数据逻辑。...observe() 后,系统会立即调用 onChanged(),从而提供 mCurrentName 中存储的最新值,如果 LiveData 对象尚未在 mCurrentName 中设置值,则不会调用...onChanged()。...LiveData生命周期变化观察 前面介绍LiveData用法的时候提到,首先,我们创建 LiveData 实例,然后调用LiveData的observe方法来注册观察者,将ViewModel和LiveData...如果判断条件都满足就继续调用Observer的onChanged方法,这个方法正是使用LiveData的observe方法的回调。
); 最后当我们数据源改变的时候,我们需要调用 livedata 的 setValue 或者 postvalue 方法。...他们之间的区别是, 调用 setValue 方法,Observer 的 onChanged 方法会在调用 serValue 方法的线程回调。...而 postvalue 方法,Observer 的 onChanged 方法将会在主线程回调。...Class modelClass); } 在实际当中,我们的做法是:实现 Factory 接口,重写 create 方法,在create 方法里面调用相应的构造函数,返回相应的实例。...而我们知道,通过 ViewModel of 方法创建的 ViewModel 实例, 对于同一个 fragment 或者 fragmentActivity 实例,ViewModel 实例是相同的,因而我们可以利用该特点
ViewModelProvider.AndroidViewModelFactory 函数 获取 ; 调用 ViewModelProvider#get 函数 , 获取自定义 ViewModel 类 ;..., 可以将 运行过程中 ViewModel 中的 Model 模型数据改变 通知 视图 View , 令视图组件显示最新的数据内容 ; 在 ViewModel 中使用了 LiveData 后 , 必须调用...androidx.lifecycle.Observer 监听器 , 当数据发生改变时 , 就会 回调 监听器中的 androidx.lifecycle.Observer#onChanged 回调函数 ;...)}" 为 Button 组件设置点击事件时 , 如果要 调用配置的 ViewModel 对象的函数 , 需要使用 ()->对象.函数() 的形式进行调用 , 如下示例 : android:onClick...实例对象 , 先获取 ViewModel 实例 , 然后设置给 DataBinding 布局 ; 设置 LiveData 观察者 , 在 ViewDataBinding 类中 , 可以直接调用 调用的
null) { return; } owner.getLifecycle().addObserver(wrapper); } 查看源码,我们调用...你会发现,setValue()其实最后就是通过调用了dispatchingValue()方法。...super S> onChanged) { Source e = new Source(source, onChanged); Source<?...LiveData的postValue(…)/value=…,是没有任何作用 当然官方推荐我们LiveData配合ViewModel一起使用,因为LiveData一般都出现在ViewModel中,所以我们下篇文章会继续分析...ViewModel.
最后一个参数是一个带接收者的Lambda表达式,这个lambda表达式的接收者是LiveDataScope,可以直接在代码块中(1处)中调用其emit方法,向LiveData发值。...super S> onChanged) 当sourceLiveData数据有变化后,onChanged这个Observer会的onChange方法会被回调,我们可以在这个回调里选择向MediatorLiveData...Source实现了Observer,其onChanged方法中会有天剑的调用addSource方法传入的observer(onChanged)的方法。...private String mKey; private SavedStateHandle mHandle; 作用是保证,LiveData所在的Viewmodel重建时,能够拿到销毁前的数据。...CoroutinLiveData出场自带所宿主的ViewModel MediatorLiveData能同时监听多个LiveData的数据变化。
主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据的变化,所以一般被用到ViewModel中,ViewModel负责触发数据的更新,更新会通知到LiveData,然后LiveData...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...对象没有任何活跃观察者时,会调用 onInactive()方法。...回调方法,也就是onChanged方法。通过改变存储值,来通知到观察者也就是调用onChanged方法。...否则正常通知到观察者的onChanged方法。 当然,如果想任何时候都能监听到,都能获取回调,调用observeForever方法即可。
这通常在ViewModel类中完成。 2.创建一个定义了onChanged()方法的Observer对象,当LiveData对象保存的数据发生变化时,onChanged()方法可以进行相应的处理。...mModel.getCurrentName().observe(this, nameObserver); } } 传递nameObserver作为参数,调用observe()之后,将立即回调onChanged...如果LiveData对象mCurrentName的值并未设置,则不调用onChanged()。 更新LiveData对象 LiveData没有公用的方法来更新存储的数据。...setValue(T)会导致Observer使用值"John Doe"调用onChanged()方法。...由于转换是延迟计算的,所以与生命周期相关的行为隐式传递,而不需要额外的显式调用或依赖关系。 如果您认为在ViewModel对象中需要Lifecycle对象,则转换可能是更好的解决方案。
中完成 2、创建一个 Observer 对象并重写其 onChanged() 方法,该方法会在 LiveData 数据更改时被回调并返回最新数据,这一步通常在 UI 控制器中完成 3、使用 observer...LiveData 对象通常存储在ViewModel 对象中,并通过 getter 方法访问,如以下示例所示: class NameViewModel : ViewModel() { private...} } 2、观察 LiveData 对象 在大多数情况下,从 app 组件的 onCreate() 方法是开始观察 LiveData 对象最合适,原因如下: onResume() 可能被多次调用...(this, nameObserver) } } nameObserver 作为 observe() 的参数注册之后,一旦 name 发生变动且 MainActivity 处于活跃状态,onChanged...() 方法就会被立即调用,然后 UI 会被更新 ?
second.value = 0 } } 在该类中提供了 postValue 和 setValue 两个函数 , 在 UI 主线程 中调用 setValue 函数 , 在 非 UI 线程的子线程...中调用 postValue 函数 更新数据 ; public class MutableLiveData extends LiveData { @Override public...void postValue(T value) @Override public void setValue(T value) } 然后 , 在 Activity 组件中 , 调用...中的 LiveData 数据 , 在 LiveData 数据发生改变时 , 会自动回调 Observer 监听器的 onChanged 函数 ; package kim.hsl.livedatademo... { override fun onChanged(t: Int) { textView.setText("${viewModel.progress.value
{ Log.d("sample", "observer1 onChanged: $t") t?....的 name } } private val observer2 = object : Observer { override fun onChanged...observer1 中修改了 User 中 name 的值 这个时候如果我们点击了按钮,发送一个 User("Joe"),observer1 和 observer2 分别会输出如下日志 observer1 onChanged...: User(name=Joe) observer2 onChanged: User(name=Michael) 复制代码 所以,除非我们有这种需求,否则不要在 observer 中改变 LiveData...ViewHolder 会发生内存泄露(监听的 LiveData 没有解绑) 这种场景下有两种解决办法: 使用 LiveData 的 observeForever 然后在 ViewHolder 销毁前手动调用
onChanged方法 liveData.observe(this, new Observer>() { /**...* 当我们的数据发生变化的时候,我们可以在这个onChanged中进行处理 */ @Override public void onChanged...(List girls) { Log.i("yd","onChanged刷新一次"); mListView.setAdapter...(T) viewModel; } } 当调用get()方法的时候,我们只是传递了一个ViewModel的.class对象,就会把我们ViewModel的className名字拼接上DEFAULT_KEY...()方法又是在哪被调用的呢?
在什么时候回调Observer的void onChanged(@Nullable T t)呢?...(mActive) { dispatchingValue(this); } } 在wasInactive && mActive调用了...((T) mData); } 调用onChanged方法。...Observer的onChanged方法。...image.png 整个架构如图, 这里看出,ViewModel持有activity或fragment,需要注意的就是内存泄漏, 记得在适当时机调用onCleared()方法。
比如点击按钮改变 simpleLiveData 的值为 “Hello LiveData” ,就会触发 Observer 的 onChanged 方法 mButton.setOnClickListener...,即有活跃的观察者对象时调用 protected void onInactive():当活跃的观察者对象数量等于 0 时调用,即无活跃的观察者对象时调用 MutableLiveData:可变的 LiveData...ViewModel 中使用,然后在 Activity / Fragment 中观察 ViewModel 里 LiveData 数据的变化: java: public class MainViewModel...}) 关于 ViewModel 的详细介绍请参考 Jetpack 之 ViewModel LiveData 结合 DataBinding 使用 接下来看看 LiveData 结合 DataBinding...setValue 方法当前版本 mVersion++,最后则是调用观察者的回调,即我们传入的 Observer 的 onChanged 方法。
首语 ViewModel 以注重生命周期的方式存储和管理界面相关的数据,当数据发生变化时,可通过接口的方式通知页面,但是有很多数据要通知时,需要定义大量的接口显得十分冗余,为此,Jetpack提供了LiveData...通过LiveData+ViewModel 完成一个计数器的例子。...public class HomeViewModel extends ViewModel { //value字段用MutableLiveData包装,通常在ViewModel类中完成 private...更新页面的LiveData对象存储在ViewModel中,而不将其存储在Activity或Fragment中。...因此,使用完以后一定要调用removeObserver()停止对LiveData的观察,否则会造成内存泄漏。
super.onCleared(); } } ViewModel是一个抽象类,只有一个onClear(),当ViewModel与之关联的Activity都被销毁时,该方法就会被调用,在方法里可以执行一些资源释放相关的工作...,注意屏幕旋转导致的Activity重建不会调用该方法。...= null) { onChangedListener.onChanged(String.valueOf(value)); } } /**...* 通过接口的形式将数据传递出去,更好的方式是通过LiveData, */ public interface onChangedListener { void onChanged...@NonNull ViewModelStore getViewModelStore(); } 实现此接口的职责是在配置更改期间保留拥有的ViewModelStore ,并在该作用域将要被销毁时调用
observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged...= new HashMap(); final void put(String key, ViewModel viewModel) { ViewModel oldViewModel...(String str) { text.setText(str); } }); observe实际上就是增加一个监听,那我们只要找到什么时候调用了onChanged方法就行了 model.select...assertMainThread("setValue"); mVersion++; mData = value; dispatchingValue(null); } dispatchingValue方法里调用了一个...((T) mData); } 这里调用了onChanged,终于完美闭环。