onActive()调用时机为:活跃的观察者(LifecycleOwner)数量从 0 变为 1 时。...onInactive()调用时机为:活跃的观察者(LifecycleOwner)数量从 1 变为 0 时。...就使用considerNotify()通知真正的观察者,observerWrapper为空 则遍历通知所有的观察者。...observerWrapper啥时候为空呢?这里先留个疑问。...dispatchingValue(null),参数是null,对应前面提到的observerWrapper为空的场景,即 遍历所有观察者 进行分发回调。
最后一个参数是一个带接收者的Lambda表达式,这个lambda表达式的接收者是LiveDataScope,可以直接在代码块中(1处)中调用其emit方法,向LiveData发值。...block中的代码会在LiveData标为活跃状态后只执行,且正常情况下只会执行一次。LiveData的非活跃到活跃状态的切换发生在注册在其身上的活跃的observer从0变为1时。...如果runningJob不为空也不会执行。...当LiveData再次处于活跃状态时也不会执行了。 一旦任务被取消成功注释8处,runningJob会被置空,注释5处 当LiveData重新处于活跃状态时block代码块就会被重新执行。...Source实现了Observer,其onChanged方法中会有天剑的调用addSource方法传入的observer(onChanged)的方法。
,避免产生空指针异常或不必要的性能损耗;当宿主生命周期不低于活跃状态(STAETED)时,LiveData 会重新尝试回调数据,确保观察者接收到最新的数据。...Lifecycle#removeObserver() // AlwaysActiveObserver 为空实现 removed.detachObserver(); removed.activeStateChanged...使用 setValue() 方法进行同步设置数据(必须在主线程调用),需要注意的是,设置数据后并不一定会回调 Observer#onChanged() 分发数据,而是需要同时满足 2 个条件: 条件...((T) mData); } 总结一下回调 Observer#onChanged() 的情况: 1、注册观察者时,观察者绑定的生命处于活跃状态,并且 LiveData 存在已设置的旧数据; 2、调用...为什么 Google 要把 LiveData 设计为粘性呢?
一、血淋淋的薪资倒挂现场 "某字节2-2候选人,手握5年经验却因答不出LiveData粘性事件原理,被应届生用25K薪资倒挂碾压。...避坑指南: 错误用法:在onCleared()中调用context引发内存泄漏 正确方案:通过AndroidViewModel+ApplicationContext注入 涨薪价值: 解决ViewModel...如何实现非粘性LiveData?" 技术拆解: 1. 源码级流程图:!...LiveData数据分发流程图 mVersion计数器决定是否触发onChanged() ObserverWrapper的lastVersion记录观察者状态 2....双向绑定在RecyclerView中卡顿如何优化?" 深度剖析: 1.
数据维护的一个补充 ; 在 ViewModel 中使用了 LiveData 后 , 先调用 LiveData#observe 函数 为 LiveData 设置 androidx.lifecycle.Observer...类型 , LiveData 的泛型为 原来的查询方法的返回值类型 ; Dao 查询方法的返回值由 List 变为 LiveData> ; Room 框架中...> 查询方法 , 只能在数据库数据发生改变被动回调时才能查询出数据 , 如果主动调用该方法查询数据库 , 会返回一个空数据的 LiveData ; 如果想要手动主动查询数据库 , 需要保留非 LiveData...ViewModel 中的数据库查询方法 获取的 LiveData , 首次设置 Observer 监听 , 会回调一次, 首次查询时 , 数据库为空 , 没有查到任何数据 , 最终得到 [] 打印结果...Dao 中返回 LiveData 的接口方法查询数据库 , 返回 androidx.room.RoomTrackingLiveData@8726677 , 但其中的数据为空 ; 调用 Dao 中返回
ViewModel 的源码分析 本次创建项目是升级 Android Studio 为 3.2.1,所以直接将项目中的依赖包替换成 androidx 下面的对应包,主要配置如下: // gradle 插件...dependencies { classpath 'com.android.tools.build:gradle:3.2.1' } // ViewModel and LiveData 版本...); mViewModel.getData().observe(this, new Observer>() { @Override public void onChanged...public static ViewModelProvider of(@NonNull FragmentActivity activity, @Nullable Factory factory) 以第二个方法为例...的 Adapter 如下: public class RvAdapter extends RecyclerView.AdapterRecyclerView.ViewHolder> { private
在平时使用RecyclerView时,下拉刷新时先更新数据然后调用Adapter.notifyDataSetChanged全量更新,修改条目时则先更新数据,然后调用Adapter.notifyItemXXX...paging_version" 创建一个ViewModel //PagingViewModel.java private UserDao mUserDao; //dao对象用来从数据库中获取数据 private LiveData...> mLiveData; //可观察的数据源 public LiveData> getLiveData() { if (null...mViewModel.getLiveData().observe(this, new Observer>() { @Override public void onChanged...首先来到LivePagedListBuilder.build(), //LivePagedListBuilder.java LiveData> build() {
mDispatchingValue = true; do { mDispatchInvalidated = false; //这里需要注意:区分ObserverWrapper对象为空...,和不为空的逻辑是不一样的 if (initiator !...while (mDispatchInvalidated); // 标记分发开始 mDispatchingValue = false; } 接下来看一下上面源码中initiator对象为空判断逻辑区别...ObserverWrapper为null 的情况。...经过分析发现在setValue方法中调用dispatchingValue(null)传递了空对象,这个时候的流程则会通知 active 的mObservers 8.2 看一下considerNotify
{ } }) liveData.setVaile("xixi") //子线程调用 liveData.postValue("test") 13、LiveData 为什么被设计出来,解决了什么问题...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...回调方法,也就是onChanged方法。通过改变存储值,来通知到观察者也就是调用onChanged方法。...否则正常通知到观察者的onChanged方法。 当然,如果想任何时候都能监听到,都能获取回调,调用observeForever方法即可。...ViewHolderholder, int position, List payloads) { if (payloads.isEmpty()) { // payloads为空
implementation "androidx.paging:paging-runtime:$paging_version" 创建一个ViewModel, //PagingNetworkViewModel2.java LiveData...NonNull ArticleBean.DataBean.Article item) { return item.getId(); } }; } public LiveData...this, new Observer>() { @Override public void onChanged...observe(this, new Observer>() { @Override public void onChanged....setInitialKey(initializeKey) .build(); } while (mList.isDetached());//始终为true
注意,MVVM这里的ViewModel就是一个名称,可以理解为MVP中的Presenter。...View.VISIBLE:View.GONE); } }); } 每次更新用户列表信息数据时,系统都会调用 onChanged() 回调并刷新界面,而不需要...因为LiveData具有生命周期感知能力,这意味着,除非 Activity 处于活跃状态,否则它不会调用 onChanged() 回调。...实现 ViewModel 的第一个想法可能是 使用Retrofit/Okhttp调用接口 来获取数据,然后将该数据设置给 LiveData 对象。...此方法就是调用Repository来执行,并且把数据设置到LiveData。
1 : -1; // 如果现在第一次新增活跃的观察者,那么回调 onActive ,onActive 是个空方法 if (wasInactive && mActive...onActive(); } // 如果现在没有活跃的观察者了,那么回调 onInactive ,onInactive 是个空方法...最后补充一下,LiveData 认为观察者生命周期可用的依据就是在 onStart 调用之后,在 onPause 调用之前。...另外,调用后相应的版本也会自增。最后就是调用 dispatchingValue 方法去分发这个数据 mData 了。...Observer 的 onChanged 方法实现回调 observer.mObserver.onChanged((T) mData); } 好啦,到这里就把 LiveData
在什么时候回调Observer的void onChanged(@Nullable T t)呢?...)内部调用setValue。...最后,如果是在mActive为true情况下, dispatchingValue(this),分发数据。...((T) mData); } 调用onChanged方法。...Observer的onChanged方法。
二、Room#Migration 迁移工具使用要点 本章节中以新增一个数据库表字段为例 , 在 【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 |...student add column sex integer not null default 1 该 SQL 语句的作用是 向 “student” 表中添加一个名为 “sex” 的整数类型列 , 该列不允许为空...add column sex integer 表示 要添加的新列名为 “sex” , 数据类型为 integer , 即整数类型 ; not null 表示该新列不允许为空值,即在插入或更新数据时,必须为该列提供非空值...MIGRATION_1_2: Migration = object : Migration(1, 2) 4、数据库更新的情况 如果之前运行了 【Jetpack】Room + ViewModel + LiveData...allowMainThreadQueries() // Room 原则上不允许在主线程操作数据库 // 如果要在主线程操作数据库需要调用该函数
User user); } 定义抽象类,继承于RoomDatabase,并使用@Database注解,注解中指定表的实体类、数据库版本、是否输出日志 使用单例模式时,构造方法不能私有化,因为Room内部会调用构造方法...二、ViewModel+LiveData+Room Room支持返回LiveData类型,结合ViewModel、DataBinding,就可以改造成一个非常棒的MVVM架构 package com.aruba.room...; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import com.aruba.room.databinding.ActivityMainBinding...userViewModel.getUsers().observe(this, new Observer>() { @Override public void onChanged...(recyclerViewAdapter); activityMainBinding.recyclerview.setLayoutManager(new LinearLayoutManager
LiveData改成了abstract,在此之前它是被定义为public,可以访问外国网站的可以看下这里的修改记录 MediatorLiveData继承自MutableLiveData,MutableLiveData...Observer接口就是观察者,其中定义了LiveData数据变化的回调方法onChanged()。...当调用LiveData的setValue()、postValue()方法后,通知观察者更新数据。...在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。...使用者不用显示调用反注册方法。 由于LiveData具有生命周期感知能力,所以LiveDataBus只需要调用注册回调方法,而不需要显示的调用反注册方法。
你会发现,setValue()其实最后就是通过调用了dispatchingValue()方法。...LiveData中的代码很简洁,400多行的代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer时绑定Fragment生命周期...= if (it == null) "未查找到User" else "为你查找到的User为:${it.name}" }) 4.2 Map源码 @MainThread public static...super S> onChanged) { Source e = new Source(source, onChanged); Source调用这个LiveData的postValue(…)/value=…,是没有任何作用 当然官方推荐我们LiveData配合ViewModel一起使用,因为LiveData一般都出现在ViewModel
比如点击按钮改变 simpleLiveData 的值为 “Hello LiveData” ,就会触发 Observer 的 onChanged 方法 mButton.setOnClickListener...0 时调用,即有活跃的观察者对象时调用 protected void onInactive():当活跃的观察者对象数量等于 0 时调用,即无活跃的观察者对象时调用 MutableLiveData:可变的...: val liveData = MutableLiveData() liveData.observeForever { //do something } 这种情况当不需要进行观察的时候就需要手动调用...setValue 方法当前版本 mVersion++,最后则是调用观察者的回调,即我们传入的 Observer 的 onChanged 方法。...activeStateChanged(true); 设置 active 为 true,也就是一直处于活跃状态,所以能一直观察数据的更新。
领取专属 10元无门槛券
手把手带您无忧上云