1. ViewModel 在 Activity 中的实现原理

1. 前言

ViewModel 的作用是专门存放与界面相关的数据,分担 Activity / Fragment 的逻辑,同时会维护自己独立的生命周期。如当系统配置发生变更(如切换语言等)、横竖屏切换等,可能会导致 Activity 销毁重建,假设要被销毁是 Activity A,需要被重新创建的是 Activity B,虽然他们都属于同一类型,但是是两个不同的实例对象。因此在 Activity 销毁重建的过程中,就涉及 A 在销毁时,其内部维护的数据要过渡到重建的 B 中,这就依赖于 ViewModel。

ViewModel is a class that is responsible for preparing and managing the data for an Activity or a Fragment . It also handles the communication of the Activity / Fragment with the rest of the application (e.g. calling the business logic classes).
.
A ViewModel is always created in association with a scope (an fragment or an activity) and will be retained as long as the scope is alive. E.g. if it is an Activity, until it is finished.
.
In other words, this means that a ViewModel will not be destroyed if its owner is destroyed for a configuration change (e.g. rotation). The new instance of the owner will just re-connected to the existing ViewModel.
.
引用自 https://developer.android.com/reference/android/arch/lifecycle/ViewModel

ViewModel 一般在 MVVM 模式中协同 Jetpack 的其他组件一起使用。另外,ViewModel 的使用需要引入: androidx.lifecycle:lifecycle-viewmodel (本文涉及的版本为 2.2.0 )。

2. ViewModel 常用的创建方式

由于 ViewModel 的生命周期是由系统维护的,因此不能直接在代码中通过 new 的方式创建。

另外 androidx.lifecycle.ViewModelProviders 在高版本中已经被废弃。

(1)直接基于 ViewModelProvider 获取

ViewModelProvider(activity/fragment).get(XXXViewModel::class.java)

(2)通过 ViewModelFactory 创建

class TestViewModelFactory(private val param: Int) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return TestViewModel(param) as T
// 实例代码
ViewModelProvider(activity/fragment, TestViewModelFactory(0)).get(TestViewModel::class.java)

其实,上述两种方式最终都是基于 ViewModelProvider.Factory 来生成 ViewModel 实例,只不过第一种方式如果不传 Factory,内部会使用默认的 Factory

@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
    noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
    val factoryPromise = factoryProducer ?: {
        defaultViewModelProviderFactory
    return ViewModelLazy(VM::class, { viewModelStore }, factoryPromise)

3. ViewModel 的生命周期

ViewModel 目前只有一个生命周期方法 onCleared(),是在 ViewModel 实例对象被清除的时候回调。

4. 关于 ViewModel 的架构规范

在 Google 的 architecture-samplesmain 分支)Demo 中,在创建 ViewModel 实例时,会传递以 Repository 为后缀的接口实现实例。这其实是实现 MVVM 模式时的一种规范。

Repository 为后缀的接口,用于连接数据层,定义数据操作的约束与规范,然后由具体的实现类去实现(如去数据库加载数据、从网络获取数据)。从而 ViewModel 与数据层的操作逻辑解耦,只需要关注业务逻辑。参考:TasksRepository

1. 前述ViewModel 的作用是专门存放与界面相关的数据,分担 Activity/Fragment 的逻辑,同时会维护自己独立的生命周期。如当系统配置发生变更(如切换语言等)、横竖屏切换等,可能会导致 Activity 销毁重建,假设要被销毁是 Activity A,需要被重新创建的是 Activity B,虽然他们都属于同一类型,但是是两个不同的实例对象。因此在 Activity 销毁重建的过程中,就涉及 A 在销毁时,其内部维护的数据要过渡到重建的 B 中,这就依赖于 ViewModel。V ViewModel-Lifecycle 这张图是在在没任何设置屏幕发生转换Activity的生命周期变化和ViewModel的生命周期。可以看重建的时候,ViewModel中的数据是不会被清理的。 借助于上面这一特点,ViewModel有下面的三个优点: Activity进行重建的时候,ViewModel的数据 目前Android开发中,常用的几种项目架构模式分别是MVC、MVP和MVVM。当然根据项目的体量和业务的不同,可能还会对这几种模式进行融合,产生其他变种模式,这个我们暂且不谈。我们本篇的主角是最近越来越受欢迎的MVVM。 随着Google在近两年推出了Jetpack系列的工具库后,MVVM的开发模式越来受开发者欢迎,毕竟是Google的亲儿子。对于开发中的MVVM模式,我们主要是依托DataBinding、ViewModel和LiveData这三者来实现。 一、对于ViewModel的使用建议 ViewModel属于lifecycle(生命周期感知型组件)中的一员,通常与LiveData、DataBinding一起使用,它们是MVVM架构的重要成员。ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。 2.ViewModel是什么 ViewModel是一个用来管理UI数据的组件。 管理UI数据?UI数据不是写在Activity和Fragment中吗?是的。 啊不是。。。自ViewMod.
1.ViewModel ViewModel作为Android JetPack里面的重要的一员,确实担任了一个十分重要的角色。也是实现MVVM架构的基础。所以会用并不能代表什么,而稍微把原理理清楚,你可以获得更多的知识(面试八股文) 1.不会因为屏幕旋转等Actiity配置而导致销毁. 2.跟随生命周期 这里就不说明APi的使用了,网上文章太多了… 3.不会因为屏幕旋转等Actiity配置而导致销毁 这里只分析AndroidX 我们来看一下他为什么可以跟随生命周期把. 我们入口使我们的实例化过程
【1】关于ViewModel ViewModel是Jetpack AAC的重要组件,同时也有一个同名抽象类。 ViewModel,意为 视图模型,即为界面准备数据的模型。简单理解就是,ViewModel为UI层提供数据。 官方文档定义如下: ViewModel 以注重生命周期的方式存储和管理界面相关的数据。(作用) ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。(特点) 到这里,你可能还是不清楚ViewModel到底是干啥的,别急,往下看。 ①背景引出: 在详细介绍View
[源码学习]ViewModel是什么? ViewModelAndroid架构组件包Jetpack的一个组件,它也是MVVM应用架构中的核心(Model-View-ViewModel),所以我们有必要学习一下ViewModel的基本原理 学习源码,我们还是老规矩,先看类结构图。 你没看错,ViewModel作为一个抽象类,只有一个空方法, 我们来看看这个类的介绍(Google developer官网介绍) ViewModel类旨在以生命周期感知的方式来存储和管理UI相关的数据。ViewModel允许数据
ViewModel的作用是为界面准备数据,数据的获取操作(如网络请求)或者一些数据处理可以在该类中编写方法,减少在Activity的代码。 ViewModel里面的数据可以分为以下三类。 普通数据,只是负责保存数据,无特别作用,可当做普通类来用 public class DataViewModel extends ViewModel { public String name;
文章目录ViewModel简介ViewModel 的基本用法 ViewModel简介 ViewModel 应该算是Jetpack 中最重要的组件之一了。其实Android 平台上之所以会出现注入MVP、MVVM 之类的项目架构,就是因为在传统的开发模式下,Activity 的任务实在是太重了,既要负责逻辑处理,又要控制UI 提示,甚至还得处理网络回调,等等。在一个小项目中这样写或许没有什么问题,但是如果在大型项目中仍然使用这样写法的话,那么这个项目将会变得非常臃肿并且难以维护,因为没有任何架构上的划分。
ViewModel和LiveData是Android架构组件中的两个重要组件。 ViewModel是一个用于存储和管理UI相关数据的类,它的生命周期与Activity或Fragment相关联,可以在屏幕旋转等配置变化时保留数据。ViewModel的作用是将UI和数据分离,避免了数据的重复加载和UI的重复创建,提高了应用的性能。 LiveData是一个可观察的数据持有类,它可以感知Activity或Fragment的生命周期,并在数据发生变化时通知UI更新。LiveData的作用是将数据的变化与UI的更新分离,避免了数据的不一致和UI的闪烁,提高了应用的稳定性。 ViewModel和LiveData的结合可以实现数据的持久化和UI的响应式更新,是现代Android应用开发中不可或缺的组件。
有关RecyclerView.Adapter 的 notifyItemChanged(int position, @Nullable Object payload) 方法 10082112: taskInfoAdapter.notifyItemChanged(i,"刷新啊"); 和 taskInfoAdapter.notifyItemChanged(i,"666");,前面的方法局部刷新,后面的没用。我只想ctm ViewModel 在 Activity 中的实现原理 控制工程小朋友: 摘抄一下楼主的精辟总结: "关于 ViewModel 实现的意义,简单的说就是要拿到之前历代被销毁的 Activity(也包含当前将要被销毁的 Activity)维护的且一直传递着的 viewModelStore 实例,使其接着继续传递到下一个被重建的 Activity 中" ViewModel 简析 盼盼编程: 写的好,很nice Android 主动 try-catch 主线程的 Exception OneDeveloper: 具体写在哪里,看你自己的需求。 比如可以写在 Application#onCreate(),写在某处,只是意味着在这之后才能生效。 但是有一个前提需要注意,这段逻辑一定要保证在主线程 looper 启用之后再调用即可。 Android 主动 try-catch 主线程的 Exception sxf141: 问下这段代码因该写在那里呢