让我们在不使用 ViewModelProvider.Factory 的情况下,试着创建一个 ViewModel 看看: 在活动中实例化: 有没有人注意到:当我们使用 ViewModelProviders...在活动中实例化 MyViewModel 时,从未没用过 MyViewModel 的构造方法,而都是使用 ViewModelProviders 这个类中的方法。...ViewModelProviders 在内部为我们管理并调用 ViewModel 的主构造函数,创建viewmodel的实例并将该实例并返回。...那么,现在让我们看看,如果我们直接把参数传递给 MyViewModel 类的构造方法时会发生了什么: 现在,我们在活动中创建 MyViewModel 实例: 太棒了!...将你的数值传入 ViewModelProvider.Factory 实例中去 你的关注是我最大的动力!
ViewModel类有如下优点: ViewModel类是具有生命感知的能力,与和他绑定的Activity一样的生命周期,它可以解决请求网络时,Activity被突然销毁造成一些不必要的麻烦。...这个方式比较老了,在源码中也能发现,ViewModelProviders的of方法其实也是调用了ViewModelProvider,自动创建了一个factory。...create是创建一个新的实例,而get是先从HashMap中找,找不到就创建新的实例。...也是为什么重建的Viewmodel是同一个对象的原因,他会把对象放在ViewModelStore类中HashMapViewModel> mMap = new HashMap();中...:使用getActivity()获得的ViewModel 作用域在Activity里和所有他创建碎片的里,意思是你在其他Fragment也获取相同内存地址的ViewModel @Override public
从图可以看出来,ViewModel 与 LiveData 和 Paging 是谷歌新组件,同时它是 android.arch.lifecycle 包里面的类,可以支持 activity 和 fragment...ViewModelProviders 的 of 方法可以传入 fragment 或者是 activity,就是说你可以在fragment 或者 activity 创建 viewmodel,而这个 viewmodel...调用了 HolderFragment 的 holderFragmentFor 来创建一个 holderFragment, 添加到 activity 上(当然这个fragment 没界面),而这个 fragment...(T) viewModel; } 同理 当viewmodelproviders.of 传入fragment时,也会走上面的流程,只不过生成holderfragment的时候用getChildFragmentManager...我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化。...ViewModel 生命周期是贯穿整个 activity 生命周期,包括 Activity 因旋转造成的重创建,直到 Activity 真正意义上销毁后才会结束。...我之前的做法是接口回调,需要统一在 Activity 里管理,并且不可避免的 fragment 之间还得互相持有对方的引用。...用法简介 ViewModel一般配合 LiveData 使用 1.获取 ViewModel 实例,通过提供的类ViewModelProviders: MyViewModel model = ViewModelProviders.of...禁止在 ViewModel 中持有 Context 或 activity 或 view 的引用。
ViewModel 类旨在以有生命周期的方式保存和管理与UI相关的数据。 这使得数据可以在屏幕旋转等配置变化的情况下不丢失。 这篇文章是详细探索ViewModel系列文章中的第一篇。...一个简单的例子 分三步骤来设置和使用ViewModel: 通过创建一个扩展 ViewModel 类来从UI控制器中分离出你的数据 建立你的 ViewModel 和UI控制器之间的通信 在 UI 控制器中使用你的...事实上,如果你需要 Application context,最好继承 AndroidViewModel ,这是一个持有 Application 引用的 ViewModel。...结论和进一步的学习 在这篇文章中,我探索了新的ViewModel类的基础知识。关键要点是: ViewModel类旨在一个连续的生命周期中保存和管理与UI相关的数据。...ViewModel对象通常会存储LiveData对象,您可以在 这里了解更多。 ViewModelProviders.of 方法通过作为参数传入的 UI控制器与 ViewModel 进行关联。
原理 以ViewModelProviders.of(this).get(CommonViewModel.class)为入口,先看ViewModelProviders.of, //ViewModelProviders.java...), factory); } 这里只需知道ViewModelProviders.of得到了当前act的ViewModelProvider,接着看get方法, //ViewModelProvider.java...) (mFactory)).create(key, modelClass); } else { //调用前边提到的工厂类,反射创建viewModel viewModel...首先viewModel存储在mViewModelStore,而这个store是创建ViewModelProvider时传进来的,即activity.getViewModelStore(), //ComponentActivity.java...getViewModelStore().clear(); } } } }); } 关于Lifecycles,可以阅读我的早些的笔记
ViewModel 的基本使用 ViewModel 的使用也非常简单,Android 提供了一个 ViewModel 类让我们去继承,并且提供了 ViewModelProviders 来帮助我们实例化...() 方法帮我们在默认情况下构建了一个 AndroidViewModelFactory 工厂类,来帮助创建 ViewModel,并且返回了一个在当前 Activity 生命周期内的 ViewModelProvider...再仔细思考一下,get 方法会优先从这个 ViewModelStore 中去拿,那么理论上只要保证 ViewModelStore 这个类在配置变化的过程中没有被销毁,那么就可以保证我们创建的 ViewModel...,一个会持有 Application 的 ViewModel; ViewModelStore ,负责存储 ViewModel 的类,并且还负责在 ViewModel 被清除之前通知它,也即调用 ViewModel.onCleared...实际上 ViewModel 不仅可以管理数据,而且还可以存放业务逻辑处理的代码,另外还能够方便 Activity 中的不同Fragment 之间互相通信,这个解决了以往我们 Fragment 之间通信的一个大问题
先写一个demo:通过ViewMOdel实现fragment之间的通信 布局: 【activity_main】 的 ViewModel大部分都用来实现MVVM模型,M层用来操作数据,V层负责展示界面,VM层用来逻辑处理。...,底层用的是HashMap,这时我们就可以知道了,ViewModel就是根据activity的名字存取Map public class ViewModelStore { private final...vm : mMap.values()) { vm.clear(); } mMap.clear(); } } 这里有put有get,一开始的ViewModelProviders.of...ViewModel基本都会跟LiveData结合使用,LiveData里面有个ObserverWrapper类,监听就是通过它实现 其实代码功能底层基本都是通过存储来实现的,无论是线程间通信还是进程间通信
ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了...就可以了,然后,在 Activity 中使用就可以了,具体如下: MViewModel mViewModel = ViewModelProviders.of(this).get(MViewModel.class...> T get(@NonNull Class modelClass) { // 获取类名称,在获取内部类名称时与 getName 有所区分 // getCanonicalName-...ViewModel 中的方法了,前面跟源码的时候会遇到各种封装类,如 ViewModelStore、ViewModelStoreOwner、AndroidViewModelFactory 等,下文中将会介绍...该类实际上使用 HashMap 存储相应的 ViewModel,非常简单: public class ViewModelStore { private final HashMap<String
我觉得这个问题很重要,当我们使用任何一个新工具的时候都需要弄清楚这个问题,要结合实际情况而非盲目跟随,接下来我会逐一尝试说明 ViewModel 对比传统方案的优劣 只要你接触 Android 开发一段时间...而我们传统的处理办法就是在配置变更期间保留对象和自行处理配置变更这两种,这两种方式都有很多坑(看看官方文档就知道了),尤其是需要恢复的数据比较多的时候,而 ViewModel 就非常适合处理这些情况 在下图中...我用一个非常简单的 Demo 来展示它的基础用法,通常我们为 app 集成 ViewModel 遵循如下几个步骤: 1、创建一个继承 ViewModel 的类来分离出 UI 控制器中的数据 2、建立 ViewModel...: ViewModel(){} 以上面的计时器为例,我们需要 UI 保持持续更新时间的状态,所以在 ViewModel 添加一个 startTime 变量用于存储不断累计的时间 class MainActivityViewModel...ViewModel 可以继承 AndroidViewModel 类,AndroidViewModel 中包含 Application 的引用 class MainActivity : AppCompatActivity
" 在代码中使用 LiveData 是一个抽象类,它的实现子类有 MutableLiveData ,MediatorLiveData。...首先,我们先写一个类继承我们的 ViewModel,里面持有 mNameEvent。...,在 Fragment 中创建 ViewModel 的时候,传入的是 Fragment 所依附的 Activity。...这里 AccountLiveData 的实现就不贴出来了,可以参考上面的 NetworkLiveData 实现 ---- 小结 这里说一点关于 LiveData 与 ViewModel 的应用场景吧,我尽量说得通俗一点...觉得不错的,请点个赞,让我们看到你们的欢呼声。你们的支持就是我写作的最大动力。
ViewModel的实例,通过ViewModelProviders.of()方法传入Activity对象,它会返回一个ViewModelProvider对象,然后我们再使用它的get()来根据不同的ViewModel...这就实现了在Activity中的ViewModel持久化特性。由于ViewModel是同一个,自然它里面的数据也是同一份。 得到ViewModel后,剩下的就是对数据的操作与响应。...ViewModelProvider 到这里我想你心中可能会有如下几个疑问 ViewModel它是如何初始化的,对象是如何实例化的 如何向ViewModel中传递初始化的参数 这两个疑问都将由ViewModelProvider...,由于我们能够明确到具体的类,所以可以直接使用正常的类实例化操作。...已经有了factory,最后在获取ViewModel时传入即可 1mViewModel = ViewModelProviders.of(this, ContactsFactory.getInstance
2) 构造数据对象 自定义ViewModel类,继承ViewModel; 在自定义的ViewModel类中添加需要的数据对象; public class DemoViewModel extends ViewModel...> mMap = new HashMap(); 第二部分职责是映射,通过类名从HashMap查找ViewModel实例。...整个映射逻辑也可以简化为:通过Activity类名找ViewModel实例; 2) ViewModel的生命周期如何管理?...其实并没有那么复杂,ViewModel在第一次调用ViewModelProvider.get(ViewModel.class)创建;而销毁就需要靠HolderFragment自己的onDestroy()...范围内监听数据的变化; ViewModel:在Lifecycle范围内存储和共享数据; Room:简化Db操作; 除了Room,可以感受到官方在尽力把大家从最初的MVC往MVVM引导,更加强大的官方组件将使
其实一开始我没有太当回事。。。直到27.1.0以后: ? 好吧,今天的主角出现了,LiveData与ViewModel。看到这里我觉得是该了解一波了。 顺便看一下截止目前最新的v7: ?...直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。...首先创建一个类,使用@LiveData注解标记你要保存的数据。注意这里的参数名称,下面会用到。...默认key值是类的规范名称,也就是包名加类名。 ? 所以一旦需要互通的Fragment类名或包名不一致,就无法数据共享。...是不是想起了 butterknife 的@BindView 与 @OnClick。 其实原理也不复杂,就是生成一个类来帮我们来获取ViewModel并实现数据的变化监听。
、性能最优的,然而这种做法在开发效率上却是最低的。...注意:要想ViewModel对象感知Activity/Fragment销毁事件,就不能使用new 关键字创建对象,必须要通过ViewModelProviders类获取ViewModel对象,如下: //...在Activity/Fragment上 MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class) 任意类 相信大家对...Scope接口,所以我们在ViewModel及任意类中调用的就是这个as方法。...注:一定要使用ViewModelProviders获取ViewModel对象,如下: //在Activity/Fragment上 MyViewModel viewModel = ViewModelProviders.of
ViewModel允许数据在Configuration改变时(比如屏幕旋转)保存,并且在旋转后恢复。 UI Controller相关的Android框架则是Activity与Fragment。...使用ViewModel 在build.gradle中添加配置 dependencies { def lifecycle_version = "1.1.1" // ViewModel and...(this, users -> { // update UI }); } } ViewModel的生命周期 这样即使Activity被重建了,通过ViewModelProviders...而当Activity被销毁时,Framework会回调ViewModel对象的onCleared方法,以至于可以让我们在该方法内部进行资源清理,避免内存泄漏。 ?...在Fragment之间共享数据 通过同一个Activity获取到的ViewModel对象相同,所以可以通过ViewModelProvider获取到的ViewModel对象是同一个。
ViewModel的实现过程 给出一个最简单的创建的示例: MainActivityViewModel viewModel=ViewModelProviders.of(this).get(MainActivityViewModel.class...); 代码很好理解,获取当前类的ViewModel提供者,之后在传入需要获得的ViewModel的类型。...先看一下ViewModelProviders都做了什么? ? 如果传入的this是Fragment就先判断下是否已经关联到Activity上,没有就抛异常。...简单看一下,代码不难理解,先赋值成员变量,之后是查看ViewModelStore中是否有传入类型的ViewModel,没有的话就通过传入的工厂类创建一个新的ViewModel 添加到ViewModelStore...这样ViewModel的实现过程就差不多结束了,还是利用Fragment的方式去获取生命周期,然后再利用工厂类来创建ViewModel。
截止到目前为止,JetpackNote源码分析的文章已经有四篇文章了,这一系列的文章我的初衷是想仔细研究一下Jetpack,最终使用Jetpack组件写一个Demo,上一篇已经分析了LiveData,...简单来说:ViewModel是以关联生命周期的方式来存储和管理UI相关数据的类,即使configuration发生改变(例如屏幕旋转),数据仍然可以存在不会销毁....3.2 Fragment数据共享 在ViewModelShareActivity中展示了ViewModel中的数据进行Fragment数据共享的功能。...源码分析 ViewModelProviders 在使用VM的时候一般都通过val vm = ViewModelProviders.of(this).get(DemoViewModel::class.java...但是在我这里发现跟他们的都不一样,我搜了一下ViewModelStores,发现它已经‘退役’了。 ? 并且它的注释也告诉了我们它的继承者: ? 也就是我们在of()方法中的: ?
在LifecycleObserver类中,可以为每个事件实现回调,这样在生命周期的对象的生命周期改变的时候我们能进行相关的处理。...2.2 State 生命周期的State本质上是介于两个生命周期事件之间的一种情况。触发事件后,生命周期将进入一个状态,然后在触发另一个事件时离开该状态并进入另一个状态。如下图所示: ?...而这个方法的所代表的意思很简单,告诉要使用Lifecycle的组件,我是一个生命周期感知组件,我存在生命周期的概念。...为此,需要访问一个名为ViewModelProviders的辅助类 ,通过这样获取的ViewModel对于一个activity / fragment只有一份: MyViewModel mMyViewModel...= ViewModelProviders.of(getActivity()).get(MyViewModel .class); ViewModelProviders这个类,本质上其实是一个工厂类。
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:xiangzhihong,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply...在JetPack架构中,ViewModel组件是一个可以感知生命周期的形式来存储和管理视图相关的数据的组件,因此它适合以下场景。 适合需要保存大量数据的场景。...MyViewModel类,创建ViewModel类千万不能持有Context的引用,否则会引起内存泄漏,如果需要使用Context可以继承AndroidViewModel。...5.2 ViewModelProvider 在前面的示例代码中,我们在Activity中使用ViewModelProviders.of方法来获取ViewModel实例,如下所示。...MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class); 打开ViewModelProviders类的源码,可以发现