,它是对抽象ViewModel的扩展,使用它时需要传入Application对象,方便一些资源的获取。...ViewModel的实例,通过ViewModelProviders.of()方法传入Activity对象,它会返回一个ViewModelProvider对象,然后我们再使用它的get()来根据不同的ViewModel...的Class对象来获取到相应的ViewModel实例。...ViewModelProvider 到这里我想你心中可能会有如下几个疑问 ViewModel它是如何初始化的,对象是如何实例化的 如何向ViewModel中传递初始化的参数 这两个疑问都将由ViewModelProvider...所以如果我们要再传入其它自定义的初始化参数,只需实现我们自己的create()方法。要自定义create()方法,我们就要自定义一个factory,继承NewInstanceFactory类。
MyViewModel类,创建ViewModel类千万不能持有Context的引用,否则会引起内存泄漏,如果需要使用Context可以继承AndroidViewModel。...ViewModel 有一个子类AndroidViewModel,它的源码如下。...5.2 ViewModelProvider 在前面的示例代码中,我们在Activity中使用ViewModelProviders.of方法来获取ViewModel实例,如下所示。...获取ViewModel实例时,ViewModelProvider一共提供了4个构造函数,另一个比较重要的构造函数是 public ViewModelProvider(@NonNull ViewModelStore...六、ViewModel是如何实现状态保留的 前面说过,ViewModel是不会随着Activity/Fragment的销毁而销毁的,因为ViewModel是将数据使用ViewModelStore 保存在
ViewModel生命周期 ViewModel的源码分析 什么是ViewModelStore 什么是ViewModelStoreOwner 如何简化Fragment之间的通信 ViewModel 的生命周期...如下: /** * 如果需要使用Context可以选择继承 AndroidViewModel */ public class MViewModel extends ViewModel {...AndroidViewModelFactory,也可以自定义 Factory,直接调用上面任意一个方法创建 ViewModelProvider 即可。...} 此时,ViewModel 就创建好了,那 VIewModel 是如何被创建的呢,mFactory 的具体实现这里是默认的 AndroidViewModelFactory,其创建时通过反射获取构造方法创建的...如何简化 Fragment 之间的通信 Fragment 之间的通信以前是使用接口通过宿主 Activity 转发来实现的,现在可以使用同一 ViewModel 完成两个 Fragment 之间的通信,
、Activity 组件 3、UI 布局文件 4、运行效果 五、ViewModel 生命周期 六、ViewModel 使用注意事项 一、Activity 遇到的问题 ---- Activity 遇到的问题...以及 数据模型 Model 销毁 ; Activity 中的组件 获取数据时 , 不直接从 数据模型 Model 中获取 , 而是 从 ViewModel 架构组件中获取 ; ViewModel 作用...Activity 组件 在 Activity 中 , 要 绑定 ViewModel 组件 , 通过 ViewModelProvider 获取 MyViewModel::class.java 类 对应的...textView = findViewById(R.id.textView) // 获取 ViewModel myViewModel = ViewModelProvider...关联的所有的 Activity 或 Fragment 全部销毁 , 则 ViewModel 实例对象 也会被销毁 ; 六、ViewModel 使用注意事项 ---- ViewModel 使用注意事项
modelClass, e); } } } AndroidViewModelFactory /** * {@link Factory} which may create {@link AndroidViewModel...* * @param application an application to pass in {@link AndroidViewModel} * @return A...a {@code AndroidViewModelFactory} * * @param application an application to pass in {@link AndroidViewModel...> T create(@NonNull Class modelClass) { if (AndroidViewModel.class.isAssignableFrom(modelClass...ViewModel的onCleared什么时候回调 ViewModel /** * Clears internal storage and notifies ViewModels that they
这样做也违背了“单一功能原则”,页面只应该负责处理用户与UI控件的交互及数据展示,获取数据的业务逻辑应该单独处理。...:2.2.0" 使用 首先自定义一个ViewModel,继承ViewModel类。...我们通过一个计数器的例子来展示ViewModel的使用,将视图与数据分离。...的实例化是通过ViewModelProvider来完成的,它会判断ViewModel是否存在,若存在直接返回,不存在则创建。...如果实例化ViewModel要传递Context对象,可以使用AndroidViewModel类,它继承自ViewModel,并接收Application作为Context,因此它的生命周期和应用Application
对于Android传统的代码编写方式,一般地,将页面UI的处理,数据的加载,全部放在Activity或Fragment中进行,但这并不满足“单一功能原则”,也不易于维护和扩展。...层,M层负责数据的处理,View层负责UI的展示,不同的地方在于如何将M层与V层进行结合。...[1240] 上述代码中也介绍了最重要的一个点,那就是ViewModel实例的创建,首先需要创建一个ViewModelProvider类对象,其构造方法中需要传入Activity实例,在androidx...但如果ViewModel中必须要用到Context怎么办呢,可以将ViewModel类继承自AndroidViewModel,AndroidViewModel继承自ViewModel,并且接收Applcation...ViewModel不会受Actvity生命周期的影响,那是不是可以使用ViewModel替代onSaveInstanceState()方法呢?
ViewModel 获取通过 ViewModelProvider(activity)[VM::class.java] 今天来探究下 ViewModel 具体是如何创建出来的。...获取 ViewModel 示例也是通过 ViewModelProvider 的get 方法: @MainThread public ViewModel> T get(@...这几层的分工结构可以用下图表示: 构造ViewModel 看到这里,我们比较关心的点剩下的就是如何使用 Factory 创建 ViewModel,以及 Factory 是怎么来的,有哪些 Factory...前者会默认尝试创建 AndroidViewModel 。否则会调用 super 的 create 方法,创建一个普通的 ViewModel。...获取 ViewModelStoreOwner 一般我们使用 FragmentActivity 或者 Fragment 作为我们的 ViewModelStoreOwenr, 以 FragmentActivity
用法简介 ViewModel一般配合 LiveData 使用 1.获取 ViewModel 实例,通过提供的类ViewModelProviders: MyViewModel model = ViewModelProviders.of...继续看 of 方法: return new ViewModelProvider(ViewModelStores.of(activity), sDefaultFactory) 出现了两个新的类ViewModelProvider...ViewModel 的 get 方法。...至此ViewModelProviders of 做了哪些事情呢: 1、初始化了ViewModelProvider内部维护了 用于创建 VM 的 Factory,和用户存放 VM 的ViewModelStore...如果非得使用Context ,可以继承AndroidViewModel 类中获取 ApplicationContext public class AndroidViewModel extends ViewModel
一.视图和数据模型之间的桥梁ViewModel 在页面(Activity/Fragment)功能较为简单的情况下,通常会把UI交互,与数据获取等相关的业务逻辑全部写在页面中。...如果数据不进行存储,则通常还要去重新获取一次数据。幸运的是,ViewModel可以为我们解决这个问题。...ViewModel的实例化过程是通过ViewModelProvider来完成的,ViewModelProvider会判断ViewModel是否存在,若存在的话直接返回,否则他会创建一个ViewModel...四.ViewModel和AndroidViewModel 前面提到,ViewModel是独立于配置变化的,它的生命周期比页面长,所以需要注意的一点是:不要向ViewModel传入任何类型的Context...如果一定要这样做,可以使用AndroidViewModel类,它继承自ViewModel,并接收Application作为Context。
这一篇,我们就来深入浅出一下 ViewModel ,来讲讲 ViewModel 的使用方式、生命周期、以及它的实现原理。 1....总之 ViewModel,优点多多,接下去我们介绍下 ViewModel 的基本使用。 2....ViewModel 的基本使用 ViewModel 的使用也非常简单,Android 提供了一个 ViewModel 类让我们去继承,并且提供了 ViewModelProviders 来帮助我们实例化...看下来发现我们 ViewModel 的 class 是传给了 ViewModelProvider.get() 方法。...都构建了一个唯一的 key , 并通过这个 key 尝试去一个叫做 ViewModelStore 的类获取 ViewModel 的实例,如果为null ,那么会通过 Factory 去创建,并把新的实例存入到
的基本使用了。...所以 viewmodel 使用了hashmap来存储 viewmodel 啦。...get方法来获取viewmodel,从下面的的 get 方法可以看到 hashmap 的 key 是由DEFAULT_KEY 前缀和的 viewmodel 的 canonicalName 来组成。...并且get的时候 会先从hashmah 中获取viewmodel ,不存在这个viewmodel,再从 mFactory 里面创建 viewmodel ,并存进 hashmap。...的 get 方法从 hashmap 获取对用的 viewmodel。
而LiveData配合今天所讲的ViewModel使用起来真的是非常方便,接下来我们开始分析: 2.简介 2.1 是什么?...我们会在源码分析部分再去看ViewModel的生命周期具体是怎样的。下面我们看下ViewModel该怎样使用? 3....到这里ViewModel的基本使用方式我们已经了解了,接下来我们来分析一下它具体是怎么实现的?...return (T) viewModel; } get()方法就是获取VM实例的过程,如果VM不存在,则通过工厂去创建实例。...//从viewModelProvider中获取FragmentVM实例 @NonNull static FragmentManagerViewModel getInstance(
9/10. */ class NumberViewModel extends ViewModel { public int number; } 在Activity中使用ViewModelProvider...中使用Context,不要手动传入,而是继承至AndroidViewModel package com.aruba.viewmodel; import android.app.Application;...还具有异步调用不会造成内存泄漏的优点,需要结合LiveData使用,ViewModel的生命周期是独立于Activity的 三、LiveData LiveData对象提供了可观测方法,当数据发送改变时...ViewModel,并观测LiveData的值,ui线程中使用setValue方法设置LiveData的值,非ui线程使用postValue方法 package com.aruba.livedata;...进度值的观察,注意这边获取ViewModel时Owner要用Activity的上下文,因为实现联动需要使用同一个ViewModel,不同Owner会生成不同的实例 package com.aruba.livedata2
ViewModel或者是AndroidViewModel,它俩都是生命周期可感知的,唯一的区别是AndroidViewModel可以获取到应用的上下文Application。...3.2 数据创建 ViewModel的创建通常是通过ViewModelProvider进行创建和获取。...ViewModelProvider(this).get(Xxx::class.java) 而在ViewModel中,通常使用MutableLiveData作为可变UI响应数据类型。...3.4 数据绑定 对ViewModel的绑定有两种写法。 直接使用ViewDataBinding.variableId = xxx直接赋值。...所有注解的功能都是基于XML属性值为DataBinding表达式才生效(即@{}) 使用@BindingAdapter进行控件自定义属性绑定的时候,一定要使用 "@{}" 进行赋值,这一点非常重要!!
思考一下如果用常规的做法如何实现:加 Callback?还是使用 EventBus?...ViewModel 传递参数,这里分场景看一下: 在 Fragment 或者 Activity 中使用 ViewModel 注意事项 通过 ViewModelProvider 获取 ViewModel...UI 相关的数据,从 Repo 获取的数据(可能需要)经过一些处理再提供给 View,这个处理的过程应该放在 ViewModel 中(可以使用 Transforms) View 层不应该有过多的逻辑代码...中不能持有 View,一方面防止内存泄漏,另一方变这种设计有益于写单测;如果需要在 ViewModel 中使用 Context,可以使用 AndroidViewModel 传递给 LiveData 的...LiveData 非粘性消息的探索和尝试 自定义生命周期以及实现生命周期感知能力
学习了kotlin后,我们将它运用到实际开发中,结合Flow实现文件下载 最终效果: 项目使用了Navigation框架:Activity+Fragment的方式 导入依赖: implementation...、Navigation Graph的连接等操作就不介绍了 1.首先实现下载工具类,包含状态和下载实现 使用密封类定义状态: package com.aruba.flowapplyapplication.download...file.delete() emit(DownloadStatus.Err(it)) }.flowOn(Dispatchers.IO) } } 为InputStream添加扩展函数...使用LiveData定义进度属性,并实现下载按钮的点击事件,由于Flow的collect函数为挂起函数,需要使用协程作用域,我们直接使用viewModelScope: package com.aruba.flowapplyapplication.viewmodel...java.io.File /** * Created by aruba on 2021/9/19. */ class DownloadViewModel(val context: Application) : AndroidViewModel
原理1:ViewModel生命周期穿透(破解内存泄漏困局) ▍高频面试题: "为什么Fragment中获取的ViewModel会和Activity共享?...如何实现作用域隔离?" 技术解析: 1....通过HolderFragment持有ViewModel实例 FragmentManager通过FragmentTransaction将HolderFragment绑定到宿主的生命周期 2....避坑指南: 错误用法:在onCleared()中调用context引发内存泄漏 正确方案:通过AndroidViewModel+ApplicationContext注入 涨薪价值: 解决ViewModel...mUser = user; notifyPropertyChanged(BR.user); } } 编译器通过kapt生成BindingImpl类 ViewDataBinding使用
二.Room数据库的基本使用方法 1.在使用Room数据库前,先要在app/build.gradle文件中导入以下的依赖: implementation 'androidx.room:room-runtime...到这里,数据库和表就创建完成了,接下来就看看如何对数据库进行增删改查了。 ...5.结合ViewModel和LiveData,对数据库进行增删改查,并且数据库表的记录发生变化时,页面可以及时收到通知,并更新页面。 ...LiveData通常和ViewModel一起使用,ViewModel用于存储页面的数据,因此我们可以把数据库的实例化放到ViewModel中,但数据库的实例化需要用到Context对象,因此我们不宜直接用...ViewModel,而应该用其子类AndroidViewModel。
, 每当数据库中的数据发生变化时 , 就需要开启线程 , 重新获取数据库中的数据 ; 为了优化上述问题 , 可以引入 LiveData 和 ViewModel , ViewModel 是 视图 View...与 数据模型 Model 之间 数据交互的 桥梁 ; LiveData 是基于 ViewModel 的 , 是 对 ViewModel 数据维护的一个补充 ; 在 ViewModel 中使用了 LiveData...Repository 进行交互 ; ViewModel 与 Room 结合使用 , 实际上与 Repository 进行交互 ; ViewModel 需要继承 AndroidViewModel , 并且需要在类中维护...使用要点 在 Activity 组件中 , 通过调用 ViewModel 视图模型获取 数据库中的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository...调用 Room 框架的相关方法操作 SQLite 数据库 ; 首先 , 获取 ViewModel 视图模型 ; // 获取 ViewModel 视图模型对象 var viewModel
领取专属 10元无门槛券
手把手带您无忧上云