大放光彩的安卓Jetpack组件-ViewModel(一)

语言: CN / TW / HK

theme: nico

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!

引言

天道好轮回,终于星期五,但是还是忙碌了一天。在项目中,我遇到了一个问题,起因则是无法实时去获取信息来更新UI界面,因为我需要知道我是否获取到了实时信息,我想到的办法有三,利用Handler收发消息在子线程与主线程切换从而更新信息,其二则是利用在页面重绘的时候(一般是页面变动如跳转下个页面和将应用切至后台),其三就是利用Jetpack中最重要的组件之一ViewModel,最后我还是选择了ViewModel,因为感觉更方便。

言归正传

其实想到的前面两个方法并不可靠,因为我不熟悉,而ViewModel,因为项目几乎每个Activity都有对应的文件反而更为熟悉,所以接下来我就为大家从我工作出发介绍一下ViewModel。

一、概述与作用

其实Android平台上之所以会出现诸如MVP、MVVM之类的项目构架,就是因为在传统开发模式下,Activity任务实在过重,它几乎全能,既要管逻辑又要管UI显示,甚至还得管网络回调,如此等等,也许小项目还看不出来有啥问题,但在企业开发团队协作下,大型项目就会变得难以维护而且越来越臃肿,这就是架构划分之利所在。\ 而ViewModel的一个重要作用就是可以帮助Activity去分担一部分工作,它是专门用于存放于界面相关数据的,这也代表只要在界面看到的数据,与它相关之变量都应放在ViewModel,而不是Activity,从而减少Activity中逻辑量。

当然上述都是理论上的,在工作中,我们虽然用其减少activity的复杂度,但更重要的是,因为我是做摄像头方面的app,所以播放视频不可避免,这就导致横竖屏切换很重要,说到这里,就自然的不得不提到ViewModel的一个非常重要之特性。\ 首先,我们先了解一下,当手机横竖屏旋转时,Activity是会被重新创建的,这也表明存放在Activity的数据也会丢失,而ViewModel于=与Activity的生命周期不一样,它能保证手机屏幕旋转时不会被重新创建,只有当Activity退出时而一起销毁,这也就导致了ViewModel中可以用来保持界面上的数据从而不被旋转屏幕时丢失。

二、基本用法

介绍完它的作用与特性,我们来看看它是怎么用的。\ 首先Jetpack组件通常在AndroidX库形式发布,所以常用组件会在创建项目之时就自动包含进去,但想要使用ViewModel,则需要额外在gradle中添加依赖,如下:

image.png Kotlin implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" 添加好依赖后就可以使用,但需要注意的是,良好的编程写法是给每一个Activity和Fragment都创建对应的ViewModel,如下:

Kotlin class MainView :ViewModel() { }

```Kotlin package com.example.myapplication

import android.os.Bundle import android.os.PersistableBundle import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

lateinit var viewModel: MainViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

}

} ``` 主要就是这样添加到我们的Activity上。

小结

下一节我们将具体分析代码,看看ViewModel如何大放光彩!