初学 Android 架构组件之 ViewModel

栏目: IOS · Android · 发布时间: 6年前

内容简介:在 Android 中,看看下面的2个问题:本文的主角

在 Android 中, ActivityFragment 这类 UI 组件会被系统销毁或重建,未特殊处理的 UI 数据将会丢失。以往处理这类问题时,会使用 onSaveInstanceState() 保存 UI 数据,在 onCreate() 方法里恢复 UI 数据,但是数据的大小和类型有限制。

看看下面的2个问题:

  • 对于因手机 Configuration Changes 而被系统重建的界面,为了呈现之前的 UI 状态,采用上述的方式来实现起来会显得过于繁琐、不优雅。
  • 在实践 Separation of Concerns 准则时,UI 组件主要是负责显示 UI 数据、响应系统与视图事件,若再负责数据的加载和管理,会变得臃肿、不易复用。

本文的主角 ViewModel 可以很好地解决这些问题。注意:它不是用来代替 onSaveInstanceState()

ViewModel

ViewModel 抽象类被设计成专门存储和管理 UI 数据,它的定义很简单,类中只有一个空实现的 onCleared()

自定义 ViewModel

在 app 模块的 build.gradle 文件里添加依赖。

dependencies {
    implementation "androidx.lifecycle:lifecycle-extensions:2.0.0-beta01"
}
复制代码

自定义一个 ViewModel 子类 MainViewModel ,它维护一个 UI 状态: loading

class MainViewModel : ViewModel() {

    /**
     * The flag indicates that the content is loading or not.
     */
    val loading = false
}
复制代码

在 UI 组件的 onCreate() 生命周期里,先使用 ViewModelProviders.of() 方法获取当前 UI 作用域里的 ViewModelProvider 对象。再通过 ViewModelProvider 类提供的 get() 方法获取 ViewModel 对象。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val model = ViewModelProviders.of(this).get(MainViewModel::class.java)
    }
}

复制代码

生命周期

ViewModel 的生命周期与 UI 组件的生命周期相关联,如下图所示:

初学 Android 架构组件之 ViewModel

Activity 被系统重建时, ViewModel 对象不会被销毁,新的 Activity 对象拿到的是同一个 ViewModel 对象。可以很方便的使用 ViewModel 里的 UI 数据将之前的 UI 状态呈现给用户。比如上面的例子,呈现页面加载状态。

progressBar.visibility = when (model.loading) {
    true -> VISIBLE
    false -> INVISIBLE
}
复制代码

ViewModel 所在的 UI 组件被真正销毁时,它的 onCleared() 方法会被调用,可以覆盖该方法清理资源。

AndroidViewModel

当自定义的 ViewModel 类中需要使用应用上下文 Context 时,可以选择继承 AndroidViewModel 类,该类定义了 Application 字段。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微信民族志、自媒体时代的知识生产与文化实践

微信民族志、自媒体时代的知识生产与文化实践

赵旭东 / 中国社会科学出版社 / 2017-9 / 98.00元

进入二十一世纪以来,随着网络技术的发展,自媒体的悄然登场深度影响着我们的日常生活。中国社会中自媒体通讯方式的普及以及随之而有的一种文化书写的新形式——微信民族志的出现使原有文化秩序中时空意义发生转变的同时,也在重新塑造着以研究异文化为己任的人类学学科自身的成长、转型与发展。在此种情境之下,由中国人民大学人类学研究所、中国人民大学国家发展与战略研究院、中国人民大学社会学理论与方法研究中心、《探索与争......一起来看看 《微信民族志、自媒体时代的知识生产与文化实践》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换