ViewModel和MutableLiveData的简单使用

MyViewModel

简介

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

注意:要将 ViewModel 导入 Android 项目,请参阅 Lifecycle 版本说明中关于声明依赖项的说明。
Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能会决定销毁或重新创建界面控制器,以响应完全不受您控制的某些用户操作或设备事件。

如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失。例如,应用的某个 Activity 中可能包含用户列表。因配置更改而重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。

另一个问题是,界面控制器经常需要进行异步调用,这些调用可能需要一些时间才能返回结果。界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄露。此项管理需要大量的维护工作,并且在因配置更改而重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用。

诸如 Activity 和 Fragment 之类的界面控制器主要用于显示界面数据、对用户操作做出响应或处理操作系统通信(如权限请求)。如果要求界面控制器也负责从数据库或网络加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类。以这种方式为界面控制器分配过多的责任也会大大增加测试的难度。

从界面控制器逻辑中分离出视图数据所有权的做法更易行且更高效。

创建一个简单的ViewModel

    class MyViewModel : ViewModel() {
        private val users: MutableLiveData<List<User>> by lazy {//这里用到LiveData的委托和延迟初始化
            MutableLiveData().also {
                loadUsers()
            }
        }

        fun getUsers(): LiveData<List<User>> {//get函数
            return users
        }

        private fun loadUsers() {//load函数,也就是set函数
            // Do an asynchronous operation to fetch users.
        }
    }
    

在Activity里面创建

var viewModel = ViewModelProvider(this).get(MyViewModel::class.java);//使用ViewModelProvider函数创建一个实例

MutableLiveData

简介

MutableLiveData是LiveData的子类,LiveData在实体类里可以通知指定某个字段的数据更新.,MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段

创建和初始化

// 延迟初始化
private val title : MutableLiveData<T> by lazy { MutableLiveData<T>().also { it.value = "0" } }
//立即初始化
private val title : MutableLiveData<T>
 init {
       title .value = 0
  }

方法

LiveData赋值有两种方式postValue和setValue获取值则是直接使用getValue(),其实可以直接利用Kotlin的特点直接使用

private val title : MutableLiveData<T>
 init {
       title .value = 0//这里value就直接作为属性使用
  }

添加观察

将一个LiveData和一个对象的生命周期进行绑定,即可在这个对象没有结束生命周期时对内容变化时刻进行操作,通常和Activity 和Fragment 进行绑定,利用observe函数

void observe (LifecycleOwner owner, 
                Observer<T> observer)

例如


viewModel.get_title().observe(this, Observer { 里面进行操作})//这里this就是一个Activity
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的示例: 首先,我们需要在 `build.gradle` 文件中添加以下依赖项: ``` implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' ``` 然后,我们需要创建一个包含计分逻辑的 `ScoreViewModel` 类,该类将托管我们的数据。该类需要继承自 `ViewModel`。 ```kotlin import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class ScoreViewModel : ViewModel() { val teamAScore = MutableLiveData<Int>() val teamBScore = MutableLiveData<Int>() init { teamAScore.value = 0 teamBScore.value = 0 } fun addTeamAScore() { teamAScore.value = teamAScore.value?.plus(1) } fun addTeamBScore() { teamBScore.value = teamBScore.value?.plus(1) } } ``` 上述代码中,我们创建了一个 `ScoreViewModel` 类,该类包含两个 `MutableLiveData`,即 `teamAScore` 和 `teamBScore`。这两个变量存储着两个球队的得分,并且在我们的应用程序中可以随时更新。 我们还包含了两个方法 `addTeamAScore()` 和 `addTeamBScore()`,分别用于增加对应球队的得分。 接下来,我们需要创建一个 `MainActivity` 类,该类将托管我们的用户界面。 ```kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private lateinit var scoreViewModel: ScoreViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) scoreViewModel = ViewModelProviders.of(this).get(ScoreViewModel::class.java) scoreViewModel.teamAScore.observe(this, Observer { score -> team_a_score.text = score.toString() }) scoreViewModel.teamBScore.observe(this, Observer { score -> team_b_score.text = score.toString() }) team_a_plus.setOnClickListener { scoreViewModel.addTeamAScore() } team_b_plus.setOnClickListener { scoreViewModel.addTeamBScore() } } } ``` 上述代码中,我们创建了一个 `MainActivity` 类,并在其中创建了一个 `ScoreViewModel` 的实例。 我们还使用了 `ViewModelProviders.of()` 方法来获取 `ScoreViewModel` 的实例,并使用 `observe()` 方法来观察 `teamAScore` 和 `teamBScore` 变量。每当这些变量更新时,我们将更新 UI 中对应的文本视图。 最后,我们为两个加分按钮设置了点击侦听器,并使用 `addTeamAScore()` 和 `addTeamBScore()` 方法来增加对应球队的得分。 现在,当您运行应用程序时,您将看到两个球队的得分,并且您可以使用加分按钮来增加它们的分数。同时,这些更改将保存在 `ScoreViewModel` 中,并在配置更改后保持不变。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值