Jetpack - ViewModel

“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握 Jetpack AAC 系列文章: “终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握! “终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握! “终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握! … 上一篇介绍了Jetpack AAC 的数据处理组件 LiveData,它是使得 数据的更新 能以观察者模式 被observer感知,且此感知只发生在活跃生命周期状态。 这篇来介绍与LiveData搭配使用的视图模. 阅读详情

一、概念

1.1 恢复页面状态

Activity/Fragment 通常会在以下三种情况被销毁,对于后两种情况我们会希望重建时能恢复之前的页面状态。

当前界面永久离开用户跳转至其它界面或直接关闭Activity(调用finish()、点击返回按钮)
配置发生更改屏幕旋转、系统语言等操作会使 Activity 需要立即重建。
被系统杀死应用在后台因为内存不足被系统杀死,用户返回应用后,Activity 会被重建。

二、使用

2.1 获取实例

ViewModel 生命周期长于 Activity/Fragment,如果直接 new 出来就失去了意义。

2.1.1 通过属性委托 by viewModels()

public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
    noinline factoryProducer: (() -> Factory)? = null        //自定义工厂用于创建有参ViewModel
): Lazy<VM>
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
    noinline extrasProducer: (() -> CreationExtras)? = null,
    noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> 
Activity {
    val mainViewModel by viewModels<MainViewModel>()
}

2.1.2 (不推荐)通过 ViewModelProvider

调用 get() 获取 ViewModel 实例时,会先用 “包名+类名” 作为 key 到 ViewModelStore 中查找,已经创建过就直接返回(因此同一作用域下重复获取的 ViewModel 为同一实例),没有就进而调用 Factory 的 create() 反射创建一个新的并保存到 ViewModelStore 中。

ViewModelProvider构造创建

public constructor(
    owner: ViewModelStoreOwner       //Activity传参:this
) : this(owner.viewModelStore, defaultFactory(owner), defaultCreationExtras(owner))

创建无参 ViewModel 使用。

public constructor(

    owner: ViewModelStoreOwner,

    factory: Factory       //自定义工厂用于创建有参ViewModel

) : this(owner.viewModelStore, factory, defaultCreationExtras(owner))

创建有参 ViewModel 使用。

public constructor(
    store: ViewModelStore,        //Activity传参:this.viewModelStore
    factory: Factory,
    defaultCreationExtras: CreationExtras = CreationExtras.Empty,
)

上面两个都是调用的这个,传入的 defaultCreationExtras 会从 Activity/Fragment 中获取(预设 key 都是从这里注入的,如ComponentActivity 的实现中提供了 Application 和 Intent)。

伴生创建

public actual fun create(
        owner: ViewModelStoreOwner,
        factory: Factory,
        extras: CreationExtras,

): ViewModelProvider = ViewModelProvider(owner.viewModelStore, factory, extras)

public actual fun create(
    store: ViewModelStore,
    factory: Factory,
    extras: CreationExtras
): ViewModelProvider = ViewModelProvider(store, factory, extras)
get()

public open operator fun <T : ViewModel> get(modelClass: Class<T>): T

public open operator fun <T : ViewModel> get(key: String, modelClass: Class<T>): T 

形参 modelClass:需要创建的 ViewModel 的 class(如 MainActivity::class.java)。

形参 key:不指定就是“包名+类名”。

Activity {
    //构造
    val viewModel1 = ViewModelProvider(this).get(DemoViewModel::class)
    val viewModel2 = ViewModelProvider(this)[DemoViewModel::class]    //推荐
    //伴生
    val viewModel3 = ViewModelProvider.create(this)[DemoViewModel::class]
}

2.2 ViewModelProvider.Factory

        默认 Factory 使用反射创建实例,所以 ViewModel 的构造函数不能有参数 。如需创建带参 ViewModel 需要自定义 Factory。

        将自定义的 Factory 放置在其 ViewModel 文件中,以便获得更好的上下文、可读性并使其更容易被发现。

create()

public fun <T : ViewModel> create(modelClass: Class<T>): T

public fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T

CreationExtras 是在 Lifecycle v2.5.0 引入的,替代 Factory 为创建 ViewModel 提供所需参数,使得 Factory 无需再持有状态,一个无状态的 Factory 能被更好的复用。(此前为了构建不同参数类型的 ViewModel 而存在各种特殊的 Factory 子类,如提供 Application 的 AndroidViewModelFactory、提供 SavedStateHandle 的AbstractSavedStateViewModelFactory)

CreationExtrasAPPLICATION_KEY:提供当前 Application context。
VIEW_MODEL_KEY:获取的 String 为在 ViewModelProvider.get() 中传入的 key 参数。可以基于 key 区分多个 ViewModel 实例。
DEFAULT_ARGS_KEY:获取 Activity 中的 Intent 进而获取 Bundle。createSavedStateHandle 所需的 Bundle。
SAVED_STATE_REGISTRY_OWNER_KEY:提供创建 createSavedStateHandle 所需的 SavedStateRegistryOwner。
VIEW_MODEL_STORE_OWNER_KEY:createSavedStateHandle 所需的 ViewModelStoreOwner。

2.2.1 普通写法

class DemoRepository(dataSource: DataSource) : IDemoRepository
class DemoViewModel(private val demoRepository: IDemoRepository) : ViewModel()
class DemoFactory(
    private val demoRepository: IDemoRepository
) : ViewModelProvider.Factory {
    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return DemoViewModel(demoRepository) as T
    }
}

Activity {
    val viewModel1 = DemoFactory(DemoRepository(DataSource())).create(DemoViewModel::class.java)
    val viewModel2 = viewModels<DemoViewModel> { DemoFactory(DemoRepository(DataSource())) }    //推荐
}

2.2.2 伴生对象写法

class DemoViewModel(
    private val demoRepository: IDemoRepository
) : ViewModel() {
    companion object {
        fun factory = object : ViewModelProvider.Factory {
            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                @Suppress("UNCHECKED_CAST")
                return DemoViewModel(DemoRepository(DataSource())) as T
            }
        }
    }
}

Activity {
    val demoViewModel by viewModels { factory = DemoViewModel.factory(DataSource()) }
}

2.2.3 DSL 写法

class DemoViewModel(
    private val demoRepository: IDemoRepository
) : ViewModel() {
    companion object {
        fun factory(dataSource: DataSource) = viewModelFactory {
            initializer {
                DemoViewModel(DemoRepository(dataSource))
            }
        }
    }
}

Activity {
    val demoViewModel by viewModels { factory = DemoViewModel.factory(DataSource()) }
}

2.2.4 通用版写法

定义通用工厂(将自定义参数作为 CreationExtras 传递)

class DemoViewModel(repository: DemoRepository) : ViewModel()
private val demoRepository = object : CreationExtras.Key<DemoRepository>{}

@Suppress("UNCHECKED_CAST")
val ViewModelFactory = object : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
        //通过 key 获取 Application
        val myApplication = checkNotNull(extras[APPLICATION_KEY]) as MyApplication
        //通过 key 获取 SavedStateHandle
        val savedStateHandle = extras.createSavedStateHandle()
        //通过 key 获取 Activity 中 Intent 的 Bundle 数据
        val bundle = extras[DEFAULT_ARGS_KEY]
        //根据不同的 class 类名返回对应的 ViewModel 实例
        return when (modelClass) {
            DemoViewModel::class.java -> {
                //通过 key 获取自定义的参数来创建带参 ViewModel
                extras[demoRepository]?.let {
                    DemoViewModel(it)
                }
            }
            else -> {
                throw IllegalArgumentException("Unknown class $modelClass")
            }
        } as T
    }
}

Activity 中使用

//不推荐
Activity {
    //通过重写getDefaultViewModelCreationExtras()
    //来自定义 ViewModelProvider 构造中的 defaultCreationExtras
    //往里面传入提供给自定义 ViewModel 创建时需要的参数
    override val defaultViewModelCreationExtras: CreationExtras
        get() {
            super.defaultViewModelCreationExtras
            return MutableCreationExtras(super.defaultViewModelCreationExtras).apply {
                set(demoRepository, DemoRepository())
            }
        }
    val viewModel = ViewModelFactory.create(DemoViewModel::class.java)
}
val demoViewmodel1 = ViewModelProvider(
    store = this.viewModelStore,
    factory = CommonViewModelFactory,
    defaultCreationExtras = MutableCreationExtras().apply { set(DEMO_REPOSITORY_KEY, DemoRepository()) }
    )[DemoViewModel::class]

val demoViewModel2 by viewModels<DemoViewModel>(
    extrasProducer = { MutableCreationExtras().apply { set(DEMO_REPOSITORY_KEY, DemoRepository()) } },
    factoryProducer = { CommonViewModelFactory }
)
val demoViewModel3 = CommonViewModelFactory.create(
    modelClass = DemoViewModel::class.java,
    extras = MutableCreationExtras().apply { set(DEMO_REPOSITORY_KEY, DemoRepository()) }
)

Compose 中使用

@Composable
fun Demo() {
    val owner = LocalViewModelStoreOwner.current
    val defaultExtras = (owner as? HasDefaultViewModelProviderFactory)?.defaultViewModelCreationExtras ?: CreationExtras.Empty
    val extras = MutableCreationExtras(defaultExtras).apply {
        set(demoRepository, DemoRepository())
    }

    val factory = object : ViewModelProvider.Factory {
        @Suppress("UNCHECKED_CAST")
        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
            return extras[demoRepository]?.let {
                DemoViewModel(it)
            }as T
        }
    }
    val viewModel = factory.create(DemoViewModel::class.java, extras)
}

三、ViewModelStoreOwner

        在获取 ViewModel 对象时需要传入一个作用域 ViewModelStoreOwner,即保存 ViewModel 实例的地方,可以是 Activity/Fragment/Navigation 它们都有实现该接口。

        例如 ComponentActivity 会通过 Lifecycle 观察生命周期 onDestory() 并进行判断,只有在非配置更改的情况下(!isChangeingConfigurations())才会调用 clear() 清除缓存的 ViewModel 列表。这使得 ViewModels 不会因为配置更改而销毁,成为了存储在配置更改后仍然存在的数据的绝佳解决方案,这也是为什么 ViewModel 不适用在后台因为内存不足被系统杀死时的情况(使用 SavedStateHandle 解决)。

  • 由于 ViewModel 的生命周期是大于 Activity/Fragment 的, 对于数据的初始化不要放在 UI 生命周期中随着配置更改重建而反复请求,而是放在 ViewModel 自己的 init{ } 代码块中。

3.1 指定作用域

指定为最近的作用域(即获取实例时外层直接包裹它的 )。

val viewModel = ViewModelProvider(this).get(DemoViewModel::class.java)
val viewModel: DemoViewModel by viewModels()

指定为任意作用域。

val viewModel: DemoViewModel by viewModels(
    ownerProducer = { requireParentFragment() }
)
//更便捷的在Fragment中将作用域限定为宿主Activity
val viewModel: SharedViewModel by activityViewModels()

指定为 Navigation 图。

val viewModel: DemoViewModel by viewModels(
    { findNavController().getBackStackEntry(R.id.nav_graph) }
)
//更便捷的指定
val viewModel: DemoViewModel by navGraphViewModels(R.id.nav_graph)
//使用 Hilt
val viewModel: SharedViewModel by hiltNavGraphViewModels(R.id.nav_graph)

3.2 同一作用域下重复获取的 ViewModel 为同一实例

同一  Activity 下两个 Fragment 间的通信。

class DemoActivity {

    class FragmentA : Fragment() {
        val viewModel: DemoViewModel by activityViewModels()
    }

    class FragmentB : Fragment() {
        val viewModel: DemoViewModel by activityViewModels()
    }

}

四、SavedStateHandle

在自定义类 ViewModel 的构造中可传入一个 SavedStateHandle 类型参数,和 Bundle 一样以键值对形式存储数据,可以在 APP 处于后台时进程被杀死的情况下幸存下来。

  • 简化了状态的保存/还原操作,底层还是由 Activity 中 onSaveInstanceState() 、onCreate() 触发时机。
contains(key: String)检查是否存在给定键的值。
remove(key: String)移除给定键的值。
keys()返回 SavedStateHandle 中包含的所有键。
class DemoViewModel(
    private val state: SavedStateHandle
) : ViewModel() {
    //普通使用
    var name: String
        get() = state["name"] ?: ""
        set(value) { state["name"] = value }
    //编译器会提示推荐使用上面的方式存取
    var age: Int
        get() = state.get("age") ?: 0
        set(value)  { state.set("age", value) }
    //LiveData
    var addressLiveData: LiveData<String> = state.getLiveData("address", "")
    //StateFlow
    var phoneStateFlow: StateFlow<Long> = state.getStateFlow("phoneNum", 11122223333L)
    //Compose
    var coinMutableState: Long by state.saveable { mutableStateOf(123L) }
}

class DemoActivity : ComponentActivity(){
    val viewModel: DemoViewModel by viewModels()
    fun test() {
        viewModel.name
        viewModel.addressLiveData.observe(this) {}
    }
}

五、Compose中使用

  • 仅用于最顶层屏幕级组合函数(离 Activity/Fragment 中 setContent() 最近的那个)。
  • 遵循唯一可信数据源,ViewModel将状态传递给子组合项,子组合项将事件上抛给父组合项,不要直接将 ViewModel 向下传递给子组合项。
@Composable
fun DemoScreen(
    viewModel: DemoViewModel = viewModel(),
    viewmodel2: DemoViewModel2 = viewModel(factory = DemoViewModelFactory(DemoRepository()))
) {
    Demo(dataState = viewModel.dataState) {
        viewModel.buttonClicked()
    }
}

@Composable
fun Demo(
    dataState: String,
    onClick: () -> Unit,
) {
    Button(onClick = onClick) { Text(text = dataState) }
}

class DemoViewModel : ViewModel() {
    var dataState by mutableStateOf("")
        private set

    fun buttonClicked() { }
}
Jetpack-ViewModel ViewModel是Android Jetpack库中的一员,旨在以注重生命周期的方式存储和管理界面相关的数据。其与生命周期强相关。在组件(Activity/Fragment)的生命周期中ViewModel的数据会一直保存在内存中,即便在组件发生重建时(例如当Activity屏幕旋转或者设置改变等原因导致的页面重建)也会一直存在。ViewModel可以实现组件之间的数据共享,主要是通过使用相同的ViewModelStore来进行共享。 阅读详情

相关推荐

Android Jetpack -- ViewModel篇

ViewModel的出现主要为了解决两个问题: 1.当Actvitiy销毁重建过程中的数据恢复问题,虽然原来可以使用onSaveInstanceState()来完成,但是只支持能被序列化的数据而且是小量数据,对于大量数据则显得有点无力。 2.UI控制器的工作繁忙,UI控制器主要用于处理显示,交互,其他的额外操作可以委托给其他类完成,将不应该分配给UI的任务分离出来是必要的,这也就是上面所说的分离关...

qq_37704124的博客 2219

Android Jetpack Compose 使用 ViewModel

所以,在复杂的业务逻辑下,我们可以将Stateful的状态提到ViewModel中管理,这样Stateful Composable也就变成了一个Stateless Composable,通过参数传入不同的ViewModel即可替换具体的业务逻辑,大大增加了可复用性和可测试性

知识应该共享,创造才应收费 3156

Android Jetpack Compose: 传递参数到ViewModel的艺术

在Compose中,ViewModel通常通过ViewModelProvider来创建和管理。然而,官方文档主要展示了如何传递全局可用的参数(如Application级别的Repository),而没有详细解释如何传递单个String等简单参数。通过上述方法,我们可以灵活地将String或其他类型的参数传递到ViewModel中。选择哪种方法取决于项目的需求和复杂度。如果你的项目比较简单或学习目的,使用第一或第二种方法是非常直观的。如果项目较大或需要更复杂的依赖管理,考虑使用依赖注入框架。

m0_74337424的博客 426

Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用

Compose可以配合多个Jetpack组件使用 Compose可以配合多个Jetpack组件开发提高开发效率 多种组合方式 Compose配合ViewModel使用 概述 Compose中ViewModel的使用和Jetpack一致,通常我们构建页面的时候,如果一条数据多个布局都需要使用到的话我们只能在方法的形参中层层传递。但是这样明显是不合理的,会降低代码的可读性。 使用ViewModel可以完美的解决这个问题,Compose中使用ViewModel的话需要引入lifecycle-viewmodel-c

ymeddmn的博客 5698

Jetpack ViewModel 基本使用

简介 ViewModel,直接翻译过来就是"视图模型",再换个说法,其实就是"界面模型"。界面,在Android系统中通常采用Activity和Fragment来承载。那么,“界面模型”,我理解就是用于处理界面数据,界面逻辑等内容的载体,便于分担传统MVC架构中Controller角色的职责。由此,可总结ViewModel的基本作用: 数据持久化 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失。例如,应用的某个 Activity 中可能包含用户列表。因配置更改而重新创建

AndroidKt 2201

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+

Jetpack之ViewModel的使用

ViewModel可以算是Jetpack中最重要的组件之一了,他出现的目的是以生命周期意识的方式存储和管理用户界面相关的数据。它可以用来管理Activity和Fragment中的数据。还可以拿来处理Fragment与Fragment之间的通信等等。后来大家发现他非常适合我们MVVM架构作为数据层去使用。所以大家会讲它配合LiveData去使用,但是大家不要着急直接去看MVVM的ViewModel+LiveData+DataBinding。先一个个一个看更利于你完整的了解MVVM架构。

小孟来码的博客 9872

快速谱峭度算法解析

最近一直在研究振动信号的最优解调带宽寻找方法,而快速谱峭度算法是最常见的一种,因此本篇文章准备对该算法做个深入解析,也相当于自己的学习记录了。本篇文章对快速谱峭度算法做了一个较为详细的介绍,实际上就是通过多组滤波器将信号分解到不同的频段,再计算每个频段的峭度,从而找到值最大的频段,进一步地我们也可以选取其他指标作为频段的选择,以便更好地找到振动信号中的故障信息。

qq1234534215的博客 2742

Jetpack ViewModel

ViewModel 是 Android Jetpack 架构组件之一,用于管理与 UI 相关的数据,并在配置更改(如屏幕旋转)时保持数据的持久性。数据持久化:ViewModel 可以在 Activity 或 Fragment 重建时保留数据,避免重复加载。UI 与数据分离:ViewModel 将 UI 逻辑与数据逻辑分离,使代码更易于维护和测试。生命周期感知:ViewModel 的生命周期与 Activity 或 Fragment 的生命周期相关联,但不会因为配置更改而被销毁。

Bonnie_cat的博客 1071

Shader之——花草动画shader

今天 ,接到了个需求,花草的动画。谈到花草动画,立马就想到顶点动画,让顶点动起来就可以实现了。但是有个问题,所有的草都往一个方向运动,这个就麻烦了。因为在shader里没有随机这种概念,提到最多的是用一张噪声图来模拟。在网上搜索了一下,发现有更好的办法,就是用每个顶点到一个点的距离来控制动画的开始,毕竟每个顶点到同一个点的距离很少是一样的。 float dis = distance ...

baicaishisan的博客 2184

CTF密码学奇技淫巧:当Base64遇到ROT13与Atbash

本文深入解析CTF竞赛中Base64、ROT13与Atbash的复合编码技术,提供Python实现与CyberChef可视化处理方案,帮助选手掌握密码学题目的解题技巧。通过NewStarCTF2025实战案例,对比脚本化与可视化工具的优劣,提升Web安全竞赛中的编码处理能力。

weixin_29001683的博客 509

Jetpack 之 ViewModel

Jetpack 系列第三篇,这次回顾 ViewModel,ViewModel 作为 MVVM 架构中的 VM 层,具有自己的生命周期,且生命周期贯穿整个 Activity 或 Fragment,相较于之前 MVP的 Presenter,它的存活时间更长,所以作为界面数据的持有者和控制者会更有优势。

禽兽先生不禽兽 1141

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案

将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取!

CHUXUEZHE8210的博客 1994

Jetpack之ViewModel讲解

【1】关于ViewModel ViewModel是Jetpack AAC的重要组件,同时也有一个同名抽象类。 ViewModel,意为 视图模型,即为界面准备数据的模型。简单理解就是,ViewModel为UI层提供数据。 官方文档定义如下: ViewModel 以注重生命周期的方式存储和管理界面相关的数据。(作用) ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。(特点) 到这里,你可能还是不清楚ViewModel到底是干啥的,别急,往下看。 ①背景引出: 在详细介绍View

zjcoming 1000

uniapp+google map不显示

uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示

renkai721的专栏 527

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2373

jetpack之ViewModel的简单使用

讲解了ViewModel的简单使用

i_xiang_la_shi的博客 1086

第4-4课:状态压缩与动态规划

什么是状态压缩 动态规划问题中重要的一环就是确定状态的定义,在大多数情况下,状态中所包含的信息并不多,比如线性规划问题的状态一般表示为 d[i,j](i 表示状态的位置,j 表示状态的阶段),算法实现时可用二维数组保存计算过程中的状态。但是也有一些问题,它的状态中包含的信息很多,比如它的状态可能是一个集合中各个元素的情况,或者是像铺瓷砖问题这样,是某一行的覆盖状态。如果沿用简单的状态表示方法,则可...

oRbIt 的专栏 700

JetPack初探之ViewModel

JetPack初探之ViewModel 简介 官方介绍: ViewModel is a class that is responsible for preparing and managing the data foran Activity} or a {@link androidx.fragment.app.Fragment Fragment}. It also handles the co...

xyzahaha的博客 451

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Jetpack系列组件之ViewModel

Jetpack简介 在2018年Google I/O大会发布了一系列辅助android开发者的实用工具,统称Jetpack,Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。 ViewModel 这篇文章主要讲ViewModel的使用及原理。ViewModel主要用来管理...

小久久的博客 1257

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android Jetpack系列之 ViewModel

前言 前面两篇文章我们已经学习了Lifecycle和DataBind,本片文章我们来学习Jetpack系列中比较重要的ViewModel,Jetpack的很多很多组件都是搭配使用的,所以单独的知识点可能会有些”无意义“但却是我们项目实战的基础! ...

黄林晴 7287

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JetPack ViewModel

初始化 .无参 class MyViewModel : ViewModel() { } // Activity中调用 class MyActivity : AppCompatActivity() { val model: MyViewModel by viewModels()//1 override fun onCreate(savedInstanceState: Bundle?) { val model = ViewModelProviders.of(this.

moyuxueyi的专栏 229

Android Jetpack | ViewModel

本文重点对ViewModel的复用原理的详细细节展开了分析,分两种情况,带SavedStateHandle的情况下与不带SavedStateHandle的情况。其中,前者即使应用因内存不足导致进程被杀掉后重建,虽然重建前后的ViewModel不是同一个,但ViewModel依旧可以复用,其底层依赖于Bundle,而因配置文件改变的重建,复用的是同一个ViewModel;而后者在应用进程被杀掉的情况下是不能实现复用的,因配置改变重建是可以实现复用的,重建前后复用的是同一个ViewModel;

itTalmud的博客 813

Android Jetpack之ViewModel

ViewModel简介 ViewModel综述 ViewModel是Google Jetpack组件中的一员,注重以生命周期的方式存储和管理UI界面相关的数据,防止内存泄漏。 另外可以让数据在发生配置更改(如屏幕旋转后)仍然存在,优于onSaveInstanceState()+onCreate()方式,因为后者只适合可以序列化的 少量数据,不适合大的数据,如列表等。 ViewModel相关的类 ...

android小菜 1051

Android Jetpack 之 ViewModel

Android Jetpack 之 ViewModel

下午吃早餐同学 1247
上一篇: Framework - AMS
下一篇: Compose 修饰符 - 原理
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值