博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学 Android 架构组件之 ViewModel
阅读量:7104 次
发布时间:2019-06-28

本文共 1649 字,大约阅读时间需要 5 分钟。

在 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 组件的生命周期相关联,如下图所示:

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

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

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

AndroidViewModel

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

参考资料

转载地址:http://vwuhl.baihongyu.com/

你可能感兴趣的文章
PDF转换为SWF
查看>>
Maven项目下update maven后Eclipse报错:java.lang.ClassNotF
查看>>
linux开机启动流程
查看>>
Sublime Text Build 3017 x86 dev版发布
查看>>
JS判断移动端访问设备并解析对应CSS
查看>>
文件操作类2
查看>>
思科交换机端口安全
查看>>
【书签】ionic mobile app development framework
查看>>
中间固定两侧自适应三栏布局
查看>>
技术人员,你拿什么拯救你的生活----温水煮青蛙
查看>>
Setting up a development WebSphere MQ server
查看>>
android app(cordova)是否支持socket.io client
查看>>
grep的使用
查看>>
dnn|dotnetnuke 获取用户信息
查看>>
python curses库
查看>>
Yahoo!网站性能最佳体验的34条黄金守则之JavaScript和CSS
查看>>
详解ElasticSearch的store属性
查看>>
脚本安装apache
查看>>
socket Server 解决TIME_WAIT状态等待问题
查看>>
关于Apache搭建虚拟主机
查看>>