::class.java) //在activity实例化 keywordModel.setKeyWord("siri") //赋值 在fragment 获取值 //ExampleFragment.kt...val keywordModel = ViewModelProviders.of(activity as MainActivity).get(KeywordModel::class.java)...并且get的时候 会先从hashmah 中获取viewmodel ,不存在这个viewmodel,再从 mFactory 里面创建 viewmodel ,并存进 hashmap。...不会随着重建 activity 而销毁。 可以创建多个 viewmodel,而 activity 和 fragment 中 holderfragment 只有一个。...ps:在 RxPermissions 中也用到setRetainInstance这个属性。
所以它能够更好的帮助我们实现持久化数据,防止不必要的数据请求,提高App的性能。 是不是有点好奇了呢,下面我们来简单介绍它的使用,为什么说简单呢?...的实例,通过ViewModelProviders.of()方法传入Activity对象,它会返回一个ViewModelProvider对象,然后我们再使用它的get()来根据不同的ViewModel的Class...AndroidViewModelFactory重新实现了create(),在重写的方法中我们找到了我们想要的方法调用。...这样我们所需要的ViewModel实例就创建了,第一个疑问就此解决。 至于第二个疑问,细心的话不难发现,上面在调用newInstance()方法时已经传了一个初始化的参数mApplication。...中,使得数据达到持久化,减少不必要的数据请求与资源消耗。
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化。...2.异步回调问题 app 需要频繁异步请求数据,比如调接口请求服务器数据。当然这些请求的回调都是相当耗时的,之前我们在 Activity 或 fragment里接收这些回调。...(T) viewModel; } 逻辑不复杂,先看ViewModelStore是不是已经存了,没有的话就通过 factory 实例化, 并存到 ViewModelStore 中。...void onCleared() { } } Vm 只有一个onCleared方法,那么他是在何时调用的呢 这里就要介绍之前提到的 HolderFragment了: public class...禁止在 ViewModel 中持有 Context 或 activity 或 view 的引用。
,然后在onCreate()中恢复过来,但是当这些数据较大时或者数据可能又需要重新请求接口,这时候ViewModel就派上用场了,也就是说当我们把数据保存在ViewModel中,不管Activity和Fragment...源码分析 ViewModelProviders 在使用VM的时候一般都通过val vm = ViewModelProviders.of(this).get(DemoViewModel::class.java..., @NonNull Class modelClass) { //在ViewModelStore中拿到VM实例 ViewModel viewModel = mViewModelStore.get...FragmentActivity继承了它,而ComponentActivity里面通过Lifecycles观察生命周期,当接受到ON_DESTROY的事件时,清空VM。 5....总结 分析完源码之后,我们来总结一下整个流程: 通过ViewModelProviders.of(this).get(DemoViewModel::class.java)创建VM of()方法中传入 fragment.getViewModelStore
当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调...回想一下,在你的项目中,是不是经常会碰到这样的问题,当网络请求结果回来的时候,你经常需要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,才更新 UI...在实际使用中,用得比较多的是 MutableLiveData。他常常结合 ViewModel 一起使用。下面,让我们一起来看一下怎样使用它?...Activity 中创建 ViewModel,并监听 ViewModel 里面 mNameEvent 数据的变化,当数据改变的时候,我们打印相应的 log,并设置给 textView,显示在界面上。...,在 Fragment 中创建 ViewModel 的时候,传入的是 Fragment 所依附的 Activity。
ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了...,使用 ViewModel 这部分工作就不需要我们做了,很好地将视图与逻辑分离开来。...就可以了,然后,在 Activity 中使用就可以了,具体如下: MViewModel mViewModel = ViewModelProviders.of(this).get(MViewModel.class...@MainThread public ViewModel> T get(@NonNull Class modelClass) { // 获取类名称,在获取内部类名称时与...(DEFAULT_KEY + ":" + canonicalName, modelClass); } 然后调用带参数 key 的 get 方法如下: public ViewModel
原理 以ViewModelProviders.of(this).get(CommonViewModel.class)为入口,先看ViewModelProviders.of, //ViewModelProviders.java...); } else { //调用前边提到的工厂类,反射创建viewModel viewModel = (mFactory).create(modelClass);...} //存储viewModel mViewModelStore.put(key, viewModel); return (T) viewModel; } 看起来代码不是很多...而所有ActivityClientRcord又被存储在ActivityThread的成员变量里能长期存活: //ActivityThread.java final ArrayMap<IBinder, ActivityClientRecord...优缺点 优点: 页面退出时,自动销毁 屏幕旋转、语言切换后数据不丢失,而onSaveInstanceState在面对复杂数据时需要序列化 不持有view层,方便单元测试 缺点: 虽然要比onSaveInstanceState
执行onStateChanged()通知数据更新,而dispatchEvent方法在addObserver中执行 statefulObserver.dispatchEvent(lifecycleOwner...let { viewModel = ViewModelProviders.of(it).get(clazz.java) } ?: fragment?....let { viewModel = ViewModelProviders.of(it).get(clazz.java) } ?...由此可见findHolderFragment,mNotCommittedActivityHolders.get(activity),在多个activity中获取的HolderFragment可能是同一个...中创建的ViewModelStore,则为同一个ViewModelStore 最后再看ViewModelProviders.of(it).get(clazz.java)中get方法 public <T
DataBinding 结合使用时 , 在 DataBinding 布局中设置的就是该 视图模型 类对象 ; 该 ViewModel 类中 , 还 使用了 LiveData , 可以实时监听数据改变...)).get(MyViewModel::class.java) 最后 , 将 视图模型中的数据 设置到 视图组件 中 ; 与 DataBinding 结合使用时 , 将 ViewModel 对象设置到..., 可以将 运行过程中 ViewModel 中的 Model 模型数据改变 通知 视图 View , 令视图组件显示最新的数据内容 ; 在 ViewModel 中使用了 LiveData 后 , 必须调用...Model / 视图模型 ViewModel 视图 View DataBinding 中除了绑定 数据模型 Model 之外 , 还可以直接绑定 视图模型 ViewModel , 这是 DataBinding...DataBinding 中配置 Model 数据模型对象 或者 ViewModel 视图模型对象 , 在本示例中配置的是 ViewModel 实例对象 ; 配置 Model 数据模型对象 , 那么就是
mModel = ViewModelProviders.of(this).get(NameViewModel.class); // Create the observer which...四 ViewModel 的创建 mModel = ViewModelProviders.of(this).get(NameViewModel.class) 代码比较少,我们来看看。...public ViewModel> T get(@NonNull String key, @NonNull Class modelClass) { ViewModel...viewModel = mViewModelStore.get(key); if (modelClass.isInstance(viewModel)) { /...image.png 整个架构如图, 这里看出,ViewModel持有activity或fragment,需要注意的就是内存泄漏, 记得在适当时机调用onCleared()方法。
,而不是在 Activity 重建后重新去获取。...ViewModel 的实现原理 回顾下我们之前使用 ViewModel 的代码: MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class...T get(@NonNull String key, @NonNull Class modelClass) { //先从 store 中获取 ViewModel viewModel =...再仔细思考一下,get 方法会优先从这个 ViewModelStore 中去拿,那么理论上只要保证 ViewModelStore 这个类在配置变化的过程中没有被销毁,那么就可以保证我们创建的 ViewModel...,一个会持有 Application 的 ViewModel; ViewModelStore ,负责存储 ViewModel 的类,并且还负责在 ViewModel 被清除之前通知它,也即调用 ViewModel.onCleared
而我们传统的处理办法就是在配置变更期间保留对象和自行处理配置变更这两种,这两种方式都有很多坑(看看官方文档就知道了),尤其是需要恢复的数据比较多的时候,而 ViewModel 就非常适合处理这些情况 在下图中...,你可以看到一个 Activity 旋转过程的生命周期,绿色部分是与此 Activity 相关联的 ViewModel 的生命周期,图例中只展示了 Activity ,而 ViewModel 也同样可以和...() { private val viewModel by lazy { ViewModelProviders.of(this).get(MainActivityViewModel...UI 控制器中使用 ViewModel 我们在计时开始之前先将系统当前时间存入 viewModel.startTime 变量,而后每次 onCreate 被调用时,都会先取出 viewModel.startTime...by lazy { ViewModelProviders.of(this).get(CustomTimerViewModel::class.java) } @SuppressLint
2) 构造数据对象 自定义ViewModel类,继承ViewModel; 在自定义的ViewModel类中添加需要的数据对象; public class DemoViewModel extends ViewModel...DemoData data = ViewModelProviders.of(getActivity()) .get(DemoViewModel.class) .mData...(以Activity为例) 第一部分:获取ViewModelProvider 调用ViewModelProviders.of(Activity); 一路调用,最终走到HolderFragmentManager.holderFragmentFor...HolderFragment和ViewModelProvider共同持有的ViewModelStore将成为第二部分的核心; (第二部分:获取ViewModel) 调用ViewModelProvider.get...其实并没有那么复杂,ViewModel在第一次调用ViewModelProvider.get(ViewModel.class)创建;而销毁就需要靠HolderFragment自己的onDestroy()
因为很多通信其实都是通过底层存储来实现的 ViewModel大部分都用来实现MVVM模型,M层用来操作数据,V层负责展示界面,VM层用来逻辑处理。...FragmentActivity activity, @Nullable Factory factory) { Application application = checkApplication...= new HashMap(); final void put(String key, ViewModel viewModel) { ViewModel oldViewModel...= null) { oldViewModel.onCleared(); } } final ViewModel get(String key)...ViewModelProviders.of(getActivity()).get(SharedViewModel.class)的get先是跳到ViewModelProvider的get方法,然后果不其然跳到了
简介 在早期的Android开发中,由于应用相对较小,页面相对简单,我们会将数据请求、页面UI处理和数据加载全部放在Activity或Fragment中进行,但是随着项目的迭代,这种开发方式显得越来越臃肿...在JetPack架构中,ViewModel组件是一个可以感知生命周期的形式来存储和管理视图相关的数据的组件,因此它适合以下场景。 适合需要保存大量数据的场景。...在Android中,Activity/Fragment主要用于显示视图数据,如果它们也负责数据库或者网络加载数据等操作,那么势必造成代码臃肿,而将逻辑代码放到ViewModel之后,可以更有效的将视图数据相关逻辑和视图控制器分离开来...5.2 ViewModelProvider 在前面的示例代码中,我们在Activity中使用ViewModelProviders.of方法来获取ViewModel实例,如下所示。...会将数据存储在 NonConfigurationInstances 对象中,而NonConfigurationInstances是定义在Activity里面的一个类,如下所示。
例如,Activity 和 Fragment 仅依赖于视图模型。存储区是唯一依赖于其他多个类的类;在本例中,存储区依赖于持久性数据模型和远程后端数据源。...MVVM MVVM即Model - View - ViewModel的缩写,它的出现是为了将图形界面与业务逻辑,数据模型进行解耦。 MVVM也是Google推崇的一种Android项目架构模型。...api:网络请求接口。 repository:仓储层。用于存放Room数据,网络数据,本地数据等。 viewmodel:从仓储层获取数据,不需要关心数据来源。...{ return retrofit.create(Api::class.java) } } 6....= ViewModelProviders.of(this).get(MvvmViewModel::class.java) viewModel.getUser().observe(this
ViewModel 获取通过 ViewModelProvider(activity)[VM::class.java] 今天来探究下 ViewModel 具体是如何创建出来的。...对象的创建 ViewModelStore 负责 ViewModel 的存储 ViewModelStore 从 ViewModelStoreOwner 中获取。...如果不存在,则会使用 factory 去创建我们的 ViewModel 实例。 创建完成后,会把 ViewModel 实例存在 ViewModelStore 中。...从这里我们也可以知道,ViewModel 之前在进程被系统终止之后其实是不会保存数据给 ViewModel 的,在添加了 SaveStateHandle 之后才支持。...否则会调用 super 的 create 方法,创建一个普通的 ViewModel。
独有的,当Activity真正退出后,它会调用,而不是销毁后调用,因为旋转屏幕也会调用onDestroy。...所以我们可以在这取消网络请求等。平常开发中不做任何操作时,如果有网络请求中,Activity被销毁,那么极有可能请求成功返回结果到activity中造成泄漏等不必要的麻烦。...网络请求时,突然销毁activity,那么与之绑定的viewmodel也会销毁,同时我们在onCleared()方法中取消网络连接接口(call.cancel()),就算是有数据返回,activity也不会收到通知...这个方式比较老了,在源码中也能发现,ViewModelProviders的of方法其实也是调用了ViewModelProvider,自动创建了一个factory。...create是创建一个新的实例,而get是先从HashMap中找,找不到就创建新的实例。
有没有更好的视图访问方式? ? 视图访问方法当然不止一种,但正如上图所示的,在简明、编译安全和编译速度上,各个方法总有取舍。那有没有一种方法能一石 "三" 鸟呢? 即将到来!...如果只这样粗略地理解的话,ViewModel 和 SavedState 其实是一回事。然而并不是这样的。...而 ViewModel 则一直运行于进程内,即便应用配置发生变化,只要进程还在,ViewModel 保存的内容就不会消失。但只要进程消失,ViewModel 里的内容也会消失。...ViewModel 用于: 保留应用对网络、数据库的请求 当作大型对象的缓存 SavedState 用于: UI 的状态记录,比如选择区域和滚动距离等 导航状态键值记录 各取所长,联手打造流畅体验 //...{ userViewModel = ViewModelProviders.of(this) .get(UserViewModel::class.java) } 而现在只需要一行:
Jetpack为开发者提供了ViewModel的概念,将页面所需要的数据从V层和M层中剥离出来,ViewModel是介于View层和Model层的一个桥梁,使得视图和数据即区分开来,又能保持联系。...接下来,在Activity中创建出ViewModel实例对象,调用其startHandler()方法开始执行: class ViewModelActivity : AppCompatActivity()...= ViewModelProvider(this).get(MyViewModel::class.java) viewModel.startHandler() } } 运行代码会发现...[1240] 上述代码中也介绍了最重要的一个点,那就是ViewModel实例的创建,首先需要创建一个ViewModelProvider类对象,其构造方法中需要传入Activity实例,在androidx...vm : mMap.values()) { vm.clear(); } mMap.clear(); } } get()方法其核心是在调用