Android-Jetpack组件ViewModel基本使用和原理分析【建议收藏】(1)

2.1首先看一下 UserViewModel这个文件

//UserViewModel.kt

//自定义 User 数据类
data class User(var userId: String = UUID.randomUUID().toString(), var userName: String)

class UserViewModel : ViewModel() {

private val userBean = User(userName = “刀锋之影”)
// 私有的 user LiveData
private val _user = MutableLiveData().apply {
value = userBean
}
// 对外暴露的,不可更改 value 值的LiveData
var userLiveData: LiveData = _user

//更新 User 信息
fun updateUser() {
//重新给 _user 赋值
_user.value = userBean.apply {
userId = UUID.randomUUID().toString()
userName = “更新后: userName = 泰隆”
}
}
}

  • 自定义 User 数据类
  • 继承ViewModel,初始化 User
  • 声明私有的 user LIveData 用来更新数据
  • 对外暴露的,不可更改 value 值的LiveData
  • updateUser() 更新 User 信息的方法
2.2.再看下ViewModelActivity的内容

class ViewModelActivity : AppCompatActivity() {

//初始化 UserViewModel 通过 ViewModelProvider
private val userViewModel by lazy { ViewModelProvider(this)[UserViewModel::class.java] }

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val button = Button(this)
setContentView(button)

//观察 User 数据,并打印
userViewModel.userLiveData.observe(this, Observer { user ->
“User = $user”.log()
})

//点击按钮更新 User 信息
button.setOnClickListener {
userViewModel.updateUser()
}
}
}

  • 初始化 UserViewModel
  • 观察 User 数据,并打印结果
  • 点击按钮时,更新 User 信息
2.3.结果日志

//log 日志
User = User(userId=34c1a1a4-967e-439c-91e8-795b8c162997, userName=刀锋之影)
User = User(userId=a6d0f09c-9c01-412a-ab4f-44bef700d298, userName=更新后: userName = 泰隆)

2.4总结:

以上就是 ViewModel 的简单使用,是配合 LiveData 的,具体 LiveData 的使用以及与原理分析,请看这篇文章

Android Jetpack组件LiveData基本使用和原理分析

通过上文可以 ViewModel 的定义以及特点,可以知道 ViewModel在对应的作用域内,保正只生产出对应的唯一实例,保证UI组件间的通信

我们来验证一下这个特点,我再写个例子,证明一下这个特点

3.验证ViewModel在对应的作用域内,保正只生产出对应的唯一实例

3.1.ViewModelActivity2类

在ViewModelActivity2中通过supportFragmentManager添加两个 Fragment

class ViewModelActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_model)
supportFragmentManager.beginTransaction()
.add(R.id.flContainer, FirstFragment())
.add(R.id.flContainer, SecondFragment())
.commit()
}
}

3.2.两个 Fragment

class FirstFragment : Fragment() {
private val TAG = javaClass.simpleName

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val userViewModel = ViewModelProvider(activity as ViewModelStoreOwner)[UserViewModel::class.java]
“userViewModel = $userViewModel”.logWithTag(TAG)
return super.onCr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值