在开发中使用ViewModel
的时候,肯定会想数据怎么回调到Activity/Fragment
会更好,Android SDK
给我们提供了LiveData
类来做数据回调的事情。这篇博客就来分享LiveData
相关的知识,希望对看文章的小伙伴有所帮助。
LiveData概述
LiveData
是一个可以被观察的数据容器类,我们可以将数据放到LiveData
中,让数据成为被观察者
,当数据发生变化的时候,默认会发起通知,这样界面就可以发生变化。使用LiveData
之后,我们的页面逻辑就变成了如下所示:
使用LiveData的好处
确保界面符合数据状态;
不会发生内存泄漏;
不会发生因为
Activity
停止而导致崩溃;不需要手动处理生命周期;
数据始终保持最新的状态;
不管重新创建
Activity/Fragment
,都会接受到最新的数据。
LiveData的使用
我们以开发一个计时器界面为例子,使用ViewModel
、LiveData
和Activity
为例子。
1.在ViewModel使用LiveData
LiveData
是抽象类,所有我们要使用LiveData
的子类MutableLiveData
,代码示例:
import androidx.lifecycle.MutableLiveDataimport androidx.lifecycle.ViewModelimport java.util.*class TimeViewModel : ViewModel() { private var timer: Timer? = null var currentTimeValue: Int = 0 private var currentTime: MutableLiveData<Int> = MutableLiveData() fun getCurrentTime(): MutableLiveData<Int> { return currentTime } /** * 开始倒计时 */ fun startTimer() { if (timer == null) { timer = Timer() val timerTask = object : TimerTask() { override fun run() { currentTimeValue++ currentTime.postValue(currentTimeValue) } } timer?.schedule(timerTask, 1000, 1000) } } override fun onCleared() { super.onCleared() timer?.cancel() }}
2.在Activity代码调用
import androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.widget.Buttonimport android.widget.TextViewimport androidx.activity.viewModelsimport androidx.lifecycle.MutableLiveDataclass TimeActivity : AppCompatActivity(R.layout.activity_time) { private val mViewModel:TimeViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val liveData:MutableLiveData<Int> = mViewModel.getCurrentTime() // 通过LiveData.observe()观察ViewModel中的数据变化 liveData.observe(this) { // 收到数据改变的通知,更新界面。 findViewById<TextView>(R.id.timeTv).text = "当前记时:${it}s" } // 重置 findViewById<Button>(R.id.restartBtn).setOnClickListener { liveData.value = 0 mViewModel.currentTimeValue = 0 } // 计时开始 mViewModel.startTimer() }}
两个步骤简单实现一个计时器,感兴趣的小伙伴可以复制代码到编译器中实现一下。
LiveData与MutableLiveData区别
MutableLiveData的父类是LiveData;
LiveData在实体类里可以通知指定某个字段的数据更新;
MutableLiveData则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段。
来源:
互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。
评论列表