朋友们好,今天我向大家介绍下 ViewModel 中如何使用 ViewModelProvider.Factory. ---- 现在开始 所以,我们首要问题是:什么是 ViewModelProvider.Factory...让我们在不使用 ViewModelProvider.Factory 的情况下,试着创建一个 ViewModel 看看: 在活动中实例化: 有没有人注意到:当我们使用 ViewModelProviders...在活动中实例化 MyViewModel 时,从未没用过 MyViewModel 的构造方法,而都是使用 ViewModelProviders 这个类中的方法。...ViewModelProviders 的 of() 方法,在内部创建了默认的 ViewModelProvider.Factory ,从而实现了 ViewModel 的无参创建。...下图是 ViewModelFactory ViewModelFactory 的默认实现。
原理 以ViewModelProviders.of(this).get(CommonViewModel.class)为入口,先看ViewModelProviders.of, //ViewModelProviders.java...(), factory); } 这里只需知道ViewModelProviders.of得到了当前act的ViewModelProvider,接着看get方法, //ViewModelProvider.java...viewModel mViewModelStore.put(key, viewModel); return (T) viewModel; } 看起来代码不是很多,那么viewModel是如何实现...act重建后依然存活的呢?...简单,但是viewModel只能在屏幕旋转和语言切换后的页面重建维持数据,当页面意外销毁时数据无法恢复,而这点onSaveInstanceState可以做到,关于viewModel如何实现这一点,可以看我的下一篇笔记
val keywordModel = ViewModelProviders.of(activity as MainActivity).get(KeywordModel::class.java)...源码分析 在分析源码之前,应该思考一下,如果这个功能由你来写,你会是怎么实现,用什么数据结构去存数据,然后根据这个功能,可以拓展出什么其他用途。 首先看创建方法。...//ViewModelProviders.java public static ViewModelProvider of(@NonNull FragmentActivity activity) {...传入fragment时,也会走上面的流程,只不过生成holderfragment的时候用getChildFragmentManager() //HolderFragment.java HolderFragment...hashmap 获取对用的 viewmodel。
ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了...开始,ViewModelProviders 主要提供四个静态方法获取对应的 ViewModelProvider,四个静态方法如下: public static ViewModelProvider of...那就来看一下 ViewModelProvider,ViewModelProvider 中两个关键属性: private final Factory mFactory; private final ViewModelStore...,实际上像 FragmentActivity 、Fragment 等都间接或直接实现了这个接口,这一点和 LifecycleOwner 一样,源码参考如下: Activity 间接实现: ```java...如何简化 Fragment 之间的通信 Fragment 之间的通信以前是使用接口通过宿主 Activity 转发来实现的,现在可以使用同一 ViewModel 完成两个 Fragment 之间的通信,
这就实现了在Activity中的ViewModel持久化特性。由于ViewModel是同一个,自然它里面的数据也是同一份。 得到ViewModel后,剩下的就是对数据的操作与响应。...ViewModelProvider 到这里我想你心中可能会有如下几个疑问 ViewModel它是如何初始化的,对象是如何实例化的 如何向ViewModel中传递初始化的参数 这两个疑问都将由ViewModelProvider...我们回到获取ViewModelProvider的ViewModelProviders.of()方法,进入源码查看。...AndroidViewModelFactory重新实现了create(),在重写的方法中我们找到了我们想要的方法调用。...下面的能够初步体现使用AAC后的App项目架构形态 ? 最后感谢大家对AAC架构系列的支持!如果感觉不错的话,可以帮忙点赞转发一下,谢谢!同时文章中的代码都可以在Github中获取到。
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化。...ViewModel 生命周期是贯穿整个 activity 生命周期,包括 Activity 因旋转造成的重创建,直到 Activity 真正意义上销毁后才会结束。...1.实例化的代码 ViewModelProviders.of(activity,factory).get(MyViewModel.class) 1)首先是ViewModelProviders 的 of...activity 的了 ,重点看这里引出了一个 Factory,不带Factory的方法只是通过initializeFactoryIfNeeded初始化了一个sDefaultFactory(Factory的实现类...至此ViewModelProviders of 做了哪些事情呢: 1、初始化了ViewModelProvider内部维护了 用于创建 VM 的 Factory,和用户存放 VM 的ViewModelStore
5 源码分析 带着两个小问题简单的进行下源码分析: 1) ViewModel与Activity / Fragment的映射关系是如何建立起来的?...(以Activity为例) 第一部分:获取ViewModelProvider 调用ViewModelProviders.of(Activity); 一路调用,最终走到HolderFragmentManager.holderFragmentFor...如果HolderFragment尚未create,Activity就已经销毁,则从HashMap中移除该Activity,防止泄露; HolderFragment成功创建后,从HashMap中移除该Activity...; 使用HolderFragment持有的ViewModelStore对象完成ViewModelProvider的创建; 第一部分的职责是构建 / 查找HolderFragment,对构建过程中的异常做保护...整个映射逻辑也可以简化为:通过Activity类名找ViewModel实例; 2) ViewModel的生命周期如何管理?
ViewModel 的实现原理 回顾下我们之前使用 ViewModel 的代码: MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class...); 这里先从 ViewModelProviders.of 方法入手看看: //ViewModelProviders public static ViewModelProvider of(@NonNull...(application); } return new ViewModelProvider(ViewModelStores.of(fragment), factory); } ViewModelProviders.of...,在 Activity 配置改变后依然保存。...到这里 ViewModel 实现的原理就清晰了:通过注入一个retainInstance 为 true 的 HolderFragment ,利用 Fragment 的特性来保证在 Activity 配置改变后依然能够存活一下
它会调用,而不是销毁后调用,因为旋转屏幕也会调用onDestroy。...(当然还有很多其他方式) 2.2、绑定Activity 这里有如下方式: ViewModelProviders.of(this).get(class)(过时) new ViewModelProvider...(this,factory).get(class)(常用) new ViewModelProvider.NewInstanceFactory().create(class); 第一种方式:ViewModelProviders.of...这个方式比较老了,在源码中也能发现,ViewModelProviders的of方法其实也是调用了ViewModelProvider,自动创建了一个factory。...----------------ViewModelProviders.class---------------- @NonNull @MainThread public static ViewModelProvider
Jetpack源码解析—用Lifecycles管理生命周期 4....图中展示了当一个Activity经过屏幕旋转后的生命周期状态改变,右侧则是ViewModel的生命周期状态。...在之前的DemoViewModel中我们存储了seekbar的值,然后我们看Fragment中是怎么实现的?...源码分析 ViewModelProviders 在使用VM的时候一般都通过val vm = ViewModelProviders.of(this).get(DemoViewModel::class.java...总结 分析完源码之后,我们来总结一下整个流程: 通过ViewModelProviders.of(this).get(DemoViewModel::class.java)创建VM of()方法中传入 fragment.getViewModelStore
在Java 11中处理被弃用的类或接口时,核心原则是使用官方推荐的替代方案,避免依赖过时API以确保代码的兼容性和可维护性。以下是具体处理方式和示例:1.....* 包下的类)这些类属于JDK内部实现,不保证跨版本兼容性,Java 11中许多此类被标记为弃用。...替换AWT相关弃用类示例3:com.sun.awt.AWTUtilities → 标准java.awt方法// 被弃用的类// import com.sun.awt.AWTUtilities;// AWTUtilities.setWindowOpacity...处理反射相关弃用类示例4:sun.reflect.Reflection → java.lang.StackWalker// 被弃用的类// import sun.reflect.Reflection;/...处理原则总结优先使用标准库:用java.*包下的类替代sun.*等内部API。 引入第三方库:对于移除的Java EE模块,使用Jakarta EE等替代实现。
configurations { all*.exclude group: 'androidx.lifecycle', module: 'lifecycle-extensions' } 或者你可以考虑下用我的另外一种写法...你能对于gradle的一个重要的configuration有一个更深入的了解 ViewModelProviders被移除了 我们碰到的第二个问题就是在最新版本中ViewModelProviders被移除了...这部分其实也还是比较简单的,因为我们上面剔除了旧的依赖,所以我们的项目内项目内其实已经没有了ViewModelProviders的代码了。...package androidx.lifecycle @Deprecated("ViewModelProviders adapter not support any more") object ViewModelProviders...这次在我们升级的过程中,我们发现了有一部分仓库直接用了androidx.activity:activity-ktx和androidx.fragment:fragment-ktx。
LiveData如何实现数据更新 LiveData如何实现同activity声明周期绑定 viewModel如何实现数据共享 viewModel如何实现数据保存 本文就如上问题结合aac框架源码进行逐步解析...let { viewModel = ViewModelProviders.of(it).get(clazz.java) } ?: fragment?....let { viewModel = ViewModelProviders.of(it).get(clazz.java) } ?...(it).get(clazz.java)里面做了一些什么 @NonNull @MainThread public static ViewModelProvider of(@NonNull...ViewModelStore,则为同一个ViewModelStore 最后再看ViewModelProviders.of(it).get(clazz.java)中get方法 public <T extends
在Java 11中,对于被弃用的方法,官方通常提供了更安全、更高效的替代方案。以下是常见弃用方法的替换示例: 1....替代方案:使用 Java 9 引入的 StackWalker。 // 被弃用的方式 Class弃用的方式 javah -jni com.example.NativeClass # 推荐方式 javac -h . com/example/NativeClass.java # 在当前目录生成头文件...总结 替换弃用方法的核心原则: 优先使用标准库(java....*、javax.*)中的 API,避免依赖 sun.* 等内部包。 对于资源管理,用 try-with-resources 替代 finalize()。
先写一个demo:通过ViewMOdel实现fragment之间的通信 布局: 【activity_main】 实现的 ViewModel大部分都用来实现MVVM模型,M层用来操作数据,V层负责展示界面,VM层用来逻辑处理。...下面我们来看源码: ViewModelProviders.of(getActivity()) of方法 @MainThread public static ViewModelProvider of(@NonNull...} } return mViewModelStore; } getViewModelStore()方法新建了一个ViewModelStore,ViewModelStore类很简单,底层用的是...ViewModel基本都会跟LiveData结合使用,LiveData里面有个ObserverWrapper类,监听就是通过它实现 其实代码功能底层基本都是通过存储来实现的,无论是线程间通信还是进程间通信
1.引入背景 引入ViewModel之前,存在如下几个问题: (1)有的时候一个Activity里面嵌套了多个fragment,但是这些fragment里面用的是同一个数据,为了同步这些数据,我们需要用接口来传参...如果数据类型比较简单,同时数据量也不大,可以通过onSaveInstanceState()存储数据.但如果是大量数据,不方便序列化及反序列化,则上述方法将不适用. 2.ViewModel的使用 (1)gradle中引入...class UserModel extends ViewModel { String name; int age; } (3)获取ViewModel UserModel model = ViewModelProviders.of...getViewModelStore(); } return holderFragmentFor(fragment).getViewModelStore(); } 如果实现了...ViewModelStoreOwner,就返回ViewModelStore,否则就新生成一个HolderFragment来获取ViewModelStore 那就进去看看HolderFragment如何实现
在实际使用中,用得比较多的是 MutableLiveData。他常常结合 ViewModel 一起使用。下面,让我们一起来看一下怎样使用它?...的 of 方法,他主要有四个方法,分别是 ViewModelProvider of(@NonNull Fragment fragment) ViewModelProvider of(@NonNull...如果用传统的方式来实现,那么我们一般才采取观察者的方式来实现,这样,当我们需要观察数据的时候,我们需要添加 observer,在界面销毁的时候,我们需要移除 observer。...但是,如果我们用 LiveData 来实现的话,它内部逻辑都帮我们封装好了,我们只需要保证 AccountLiveData 是单例的就ok,在需要观察的地方调用 observer 方法即可。...这里 AccountLiveData 的实现就不贴出来了,可以参考上面的 NetworkLiveData 实现 ---- 小结 这里说一点关于 LiveData 与 ViewModel 的应用场景吧,我尽量说得通俗一点
我们可以看到,当屏幕旋转的时候,由于生命周期发生了改变,导致数据被销毁,所以计数器的计数又从初始值开始计数了,那么我们如何解决这个问题呢,你肯定会说,缓存呀,重写onSabeInstanceState(...)方法等等,都可以但是都不够优雅,那么如何优雅的来解决这个问题呢,这就是我们的今天的主角 ViewModel。...ViewModelProviders来获取ViewModel对象 main3ActivityViewModel = ViewModelProviders.of(this).get(Main3ActivityViewModel.class...我们需要借助ViewModelProvider.Factory来实现传参,新建Main3ActivityViewModelFactor继承自 ViewModelProvider.Factory,重写其onCreate...如此一来 我们就实现ViewModel传递参数了~
mModel = ViewModelProviders.of(this).get(NameViewModel.class); // Create the observer which...三 LiveData是如何工作的?...在上一篇中,我们知道, lifeCircle感知到生命周期时,进行对应的回调给Observer, 即回调这里的LifecycleBoundObserver的onStateChanged方法。...四 ViewModel 的创建 mModel = ViewModelProviders.of(this).get(NameViewModel.class) 代码比较少,我们来看看。...最终走如下两个分支 public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。 连续熬夜真是吃不消啊!加油!加油! 引言:为什么开发者需要ViewModel?...一、HolderFragment:寄生在Activity中的“数据保险箱” 原理剖析 当调用ViewModelProviders.of(activity)时,系统会动态注入一个无UI的HolderFragment...实现技巧 通过扩展ViewModelProvider的owner参数,支持Activity/Fragment/Navigation图等不同作用域 在Fragment中调用ViewModelProviders.of...生命周期:ViewModel存活到组件完全销毁(如Activity调用finish()),而Bundle仅在临时重建时有效 性能对比:ViewModel通过内存缓存避免序列化开销,性能提升约30倍 Q2:如何实现自定义生命周期的...通过ViewModelProvider.Factory注入自定义作用域 3.