下面来看基本用法: 创建LiveData实例,指定源数据类型 创建Observer实例,实现onChanged()方法,用于接收源数据变化并刷新UI LiveData实例使用observe()方法添加观察者...observer和Activity一起作为参数调用mLiveData的observe()方法,表示observer开始观察mLiveData。...另外,除了使用observe()方法添加观察者,也可以使用observeForever(Observer) 方法来注册未关联 LifecycleOwner的观察者。...3.1 添加观察者 LiveData原理是观察者模式,下面就先从LiveData.observe()方法看起: /** * 添加观察者. 事件在主线程分发....plug()中让源LiveData调用observeForever方法添加永远观察者-自己。
/Fragment 的 onCreate 中注册 Livedata 监听(因为在 onStart 和 onResume 中进行监听可能会有冗余调用) Livedata 简单使用 仍然还是用我们倒计时的例子...中的数据更新,当点击 activity 中按钮的时候会调用 viewmodel.sendData 方法发送数据,然后发送的数据会做一定的转换给 activity,然后 activity 打印日志展示...} 的名字杜甫知道") } } data class SwitchUser(var name: String, var age: Int) 调用部分代码 model.mapLiveData.observe...还有一个 liveCombind 用来回调超过十次调用的场景 init 方法中 liveCombind.addSource 调用就是表示用来中间拦截 livedata1 和 livedata2 的数据更新...Livedata 对象,供我们注册监听 activity 中注册 livedata 监听 model.startAsyncWithSecond(3).observe(this){
释义: 定义一个 MutableLiveData (LiveData 的一个常用子类),通过 observe 方法可以订阅修改数据的通知,通过 postValue()或者 setValue() 方法可以更新数据...2.1 LiveData.observe() LiveData 的使用流程从 observe() 开始,咱们尝试从 observe() 方法 开始分析: @MainThread public void...这里需要注意的是,当我们调用 observe() 注册后,由于绑定了 owner,所以在 active 的情况下,LiveData 如果有数据,则 Observer 会立马接受到该数据修改的通知。...这时候需要使用 AlwaysActiveObserver ,改调用 observe 方法为调用 LiveData.observeForever(Observer) 方法即可。...setValue 只不过把操作放到主线程,适合在异步线程里调用,setValue 必须在主线程里调用; 如果同时多次调用 postValue 或 setValue 修改数据,只会修改成最新的那个数据,
目录介绍 01.LiveData是什么东西 02.使用LiveData的优势 03.使用LiveData的步骤 04.简单使用LiveData 05.observe()和observerForever(...) 06.LiveData原理介绍 07.observe订阅源码分析 08.setValue发送源码分析 09.observeForever源码 10.LiveData源码总结 00.使用LiveData...通过 observe()方法连接观察者和LiveData。observe()方法需要携带一个LifecycleOwner类。这样就可以让观察者订阅LiveData中的数据,实现实时更新。...04.简单使用LiveData 4.1 单独使用LiveData 举一个最简单的案例代码:liveData = new MutableLiveData(); liveData.observe(this...调用 observe() 注册后,由于绑定了 owner,所以在 active 的情况下,使用LiveData中setValue发送数据,则 Observer 会立马接受到该数据修改的通知。
LiveData Observer LiveData 应用的主要是观察者模式,因为数据是多变的,所以肯定需要观察者来观察。而观察者和数据源建立连接就是通过 observe 方法来实现的。...最后补充一下,LiveData 认为观察者生命周期可用的依据就是在 onStart 调用之后,在 onPause 调用之前。...我们调用 observeForever 方法内部使用的就是 AlwaysActiveObserver 。 observe 顺便,我们把 observe 方法也一起看了。...还有,另外一个 observeForever 方法就不看了,和 observe 方法差不多。...另外,调用后相应的版本也会自增。最后就是调用 dispatchingValue 方法去分发这个数据 mData 了。
而 LiveData 规定了,当我们开发者订阅数据通知(调用observe())时,必须传递相应的 lifecycle 对象,其内部自然就是为了注册相应的观察者,从而做到生命周期感知,不然它怎么能自己解绑呢...,节省性能;以及能不能将解绑逻辑让框架自行执行,从而免除调用者手动调用模版代码;自然而然,我们就会想到 Lifecycle ,所以我们可以在 observe() 这里做改动: 我们更改了 observe...; 最后,当用户在调用 observe() 订阅数据更新时,我们就将用户传递的观察者使用包装类包装起来,并缓存到我们的观察者map中,接着再将其 add() 到 lifecycle 的生命周期观察数组里...问题很简单,在上面我们已经说过了,当我们调用 observe() 添加数据观察者时,内部实际会被包装为 LifecycleBoundObserver,从而添加到 lifecycle 的生命周期观察者列表...常见有如下几个解决思路: 反射解决version 在调用 observe() 方法里,反射相应的包装类 ObserverWrapper ,把其的版本号更改为 LiveData 现有的版本号;
通过使用observe()方法将上述的LiveData对象和Observer对象关联在一起。...(this, nameObserver); } } 当我们传递 nameObserver 参数的情况下调用 observe() 后,系统会立即调用 onChanged(),从而提供 mCurrentName...中存储的最新值,如果 LiveData 对象尚未在 mCurrentName 中设置值,则不会调用 onChanged()。...LiveData生命周期变化观察 前面介绍LiveData用法的时候提到,首先,我们创建 LiveData 实例,然后调用LiveData的observe方法来注册观察者,将ViewModel和LiveData...如果判断条件都满足就继续调用Observer的onChanged方法,这个方法正是使用LiveData的observe方法的回调。
() 创建观察者对象:new Observer() 绑定观察者对象:LiveData.observe 更新 LiveData 数据:LiveData.setValue 详细介绍 1、Api 介绍 LiveData...public void observe(LifecycleOwner owner, Observer调用,即有活跃的观察者对象时调用 protected void onInactive():当活跃的观察者对象数量等于 0 时调用,即无活跃的观察者对象时调用 MutableLiveData:可变的...= MutableLiveData() liveData.observeForever { //do something } 这种情况当不需要进行观察的时候就需要手动调用 removeObserver...先看一下 observe 方法源码: MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<?
Observer LiveData 应用的主要是观察者模式,因为数据是多变的,所以肯定需要观察者来观察。而观察者和数据源建立连接就是通过 observe 方法来实现的。...最后补充一下,LiveData 认为观察者生命周期可用的依据就是在 onStart 调用之后,在 onPause 调用之前。...我们调用 observeForever 方法内部使用的就是 AlwaysActiveObserver 。 observe 顺便,我们把 observe 方法也一起看了。...还有,另外一个 observeForever 方法就不看了,和 observe 方法差不多。...另外,调用后相应的版本也会自增。最后就是调用 dispatchingValue 方法去分发这个数据 mData 了。
var liveData = MutableLiveData() liveData.observe(this, object : Observer {...{ } }) liveData.setVaile("xixi") //子线程调用 liveData.postValue...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...说说LiveData原理。 说到原理,其实就是两个方法: 订阅方法,也就是observe方法。通过该方法把订阅者和被观察者关联起来,形成观察者模式。...通过改变存储值,来通知到观察者也就是调用onChanged方法。
我们创建了一个Livedata,然后对这个Livedata Observe了10次,每次都是new出不同的Observer对象,看上去我们对一个数据源做了10个观察者的绑定。...方法,最后一行是调用了addObserver方法,我们看看这个方法里做了啥。...这个onStateChanged方法经过一系列的调用最终会走到如下图所示的considerNotify方法。...Wrapper她里面有一个mLastVersion 这个值是-1,observe的函数调用最终会经过一系列的流程走到considerNotify方法中此时 LiveData的mVersion是0。...*/ fun peekContent(): T = content } 这样我们在做监听的时候只要调用getContentIfNotHandled()这个方法即可: model.navigateToDetails.observe
= (MutableLiveData) timerViewModel.getCurrentSecond(); liveData.observe(this, new Observer...tv_display.setText(second+""); } }); timerViewModel.startTiming(); } } 在页面中,通过LiveData.observe...四.LiveData的原理 为了更好地理解LiveData,我们可以深入LiveData.observe()方法的源码一探究竟。...五.LiveData.observeForever()方法 LiveData还提供了一个名为observeForever()的方法,它的用法和observe方法相似,主要的区别在于,当LiveData...因此,在用完之后,一定要记得调用removeObserver()方法来停止对LiveData的观察,否则LiveData会一直处于激活状态,Activity则永远不会被系统自动回收,这就造成了内存泄漏。
通过使用observe()方法,将上述的LiveData对象和Observer对象关联在一起。...这样可以确保系统不在Activity或Fragment的onResume()方法进行多余的调用;另外这样也确保Activity和Fragment尽早有数据可以进行显示。...model.currentName.observe(this, nameObserver) } } 在讲nameObserver对象传给observe()方法后,存储在LiveData最近的值以参数的形式立即传递到...当然,如果此时LiveData没有存储值的话,onChange()方法不会被调用。 更新 LiveData 对象 LiveData本身没有提供公共方法更新值。...setValue() 注意到value=price这里是调用了setValue(price)方法,通过该方法更新LiveData的值,进而通知处于活跃状态的订阅者。
3.使用observe()方法将Observer对象注册到LiveData对象。 observe()方法还需要一个LifecycleOwner对象作为参数。...mNameTextView.setText(newName); } }; // Observe the LiveData, passing in...mModel.getCurrentName().observe(this, nameObserver); } } 传递nameObserver作为参数,调用observe()之后,将立即回调onChanged...如果LiveData对象mCurrentName的值并未设置,则不调用onChanged()。 更新LiveData对象 LiveData没有公用的方法来更新存储的数据。...注意:必须要从主线程调用setValue(T) 方法来更新LiveData 对象. 如果代码在工作线程中执行, 你可以使用postValue(T) 方法来更新LiveData对象.
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer调用此方法,则仅将分配最后一个值。 ...setValue() setValue()的特性如下: 1.此方法只能在主线程里调用 getValue() 返回当前值。 注意,在后台线程上调用此方法并不能保证将接收到最新的值。...observe(@NonNull LifecycleOwner owner, @NonNull Observer调用removeObserver(Observer)以停止观察此LiveData, 2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。
但同一个 LiveData 可以接收 observe() 和 observeForever() 两种观察者。...LiveData.java // LiveData 持有的版本号 private int mVersion; // 异步设置数据 postValue() 最终也是调用到 setValue() @MainThread...存在已设置的旧数据; 2、调用 setValue() / postValue() 设置数据时,观察者绑定的生命周期处于活跃状态; 3、观察者绑定的生命周期由非活跃状态转为活跃状态,并且 LiveData...2.4 异步设置数据的执行过程 LiveData 使用 postValue() 方法进行异步设置数据(允许在子线程调用),内部会通过一个临时变量 mPendingData 存储数据,再通过 Handler...将切换到主线程并调用 setValue(临时变量)。
LiveData即有生命的数据,通过观察者模式实现,当数据发生变化时可以收到回调。同时还具备感知宿主生命周期的能力。...(this, s -> { QrLog.e("observe = " + s + "," + getLifecycle().getCurrentState());...原理 首先看mLiveData.observe, //LiveData.java public void observe(@NonNull LifecycleOwner owner, @NonNull...true; } 当调用observeForever时,创建的包装类就是AlwaysActiveObserver,所以,这时可以在所有生命周期都收到通知, ?...当然,调用observeForever的话,由于他的包装类没有进行removeObserver,需要在业务层手动移除,否则可能会造成内存泄漏, observe:包装类是LifecycleBoundObserver
另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。 但前面这种解决方法的主要问题是,它很难理解,而且很难看,同时,我们如何确保在导航事件发生后值能被正确的重置?...navigateToDetails.value = false } } 这种解决方法的问题是,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用...如果你不小心增加了一个以上的观察者,只有一个会被调用,而且不能保证是哪一个。...LiveData对象与系统服务连接一次,然后任何需要该资源的观察者就可以观察LiveData对象。欲了解更多信息,请参见扩展LiveData。...(this) { result.value = it } return result } 然后,如果想有一个单一的事件,只需在你的ViewModel中像这样调用这个扩展方法
首先,我们需要定义一个LiveData对象,例如: LiveData nameLiveData = new MutableLiveData(); 然后,我们可以使用observe(...在观察LiveData时,我们可以使用observe()方法,并传入一个LifecycleOwner对象作为观察者。...除了observe()方法外,LiveData还提供了observeForever()方法,该方法允许我们传入一个普通的观察者对象,而不需要绑定到生命周期。...但要注意,使用observeForever()方法需要手动在适当的时机调用removeObserver()方法,否则可能导致内存泄漏。...nameLiveData.observeForever(s -> { // Do something with the updated data }); // 在适当的时机调用removeObserver
领取专属 10元无门槛券
手把手带您无忧上云