本文旨在以少量代码和简单逻辑,演示LiveData类最基本用法,文中demo源码链接附在文末
特别说明:
本文采用 分—总结构展示代码(除gradle文件),即 先展示局部代码,随后说明其用法和作用;小节结尾处 再给出该部分对应文件的完整代码。 布局XML源码在文末。
一、简要分析
LiveData类是处理异步数据(如网络请求,数据库访问等)的一大利器,LiveData类包含 一个数据类和 一个观察者,比喻一下, 该数据类是一只信鸽,而观察者就是等鸽人,使用时,把信鸽放飞出去,等鸽人不知道它会多久回来,但是只要信鸽飞回来,等鸽人就会立即取出信鸽身上的信件,然后传给领导。
二、逻辑实现
主要的三步:
- 创建数据类
- 启动观察者
- 使用异步数据
1.添加依赖
在gradle(Moudle)文件中添加LiveData所需依赖。
dependencies {
// 生命周期库
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
}
2.创建LiveData的数据类—信鸽
在 MainActivity中声明一个MutableLiveData类命名为 textLiveData,并指定接收String类型的数据。
// 声明LiveData数据类变量——信鸽
private val textLiveData = MutableLiveData(String())
3.启动LiveData的观察者—等鸽人
// 启动该LiveData的观察者——等鸽人
textLiveData.observe(this, { it ->
it?.let {
// 先留空,后文会完善
}
})
textLiveData.observe(参数1, 参数2)
参数1是绑定生命周期的对象,也就是上文提到的等鸽人的领导,在Activity中使用LiveData时,参数1传this,与该Activity绑定即可。
参数2是处理异步数据的方式,此处为了安全使用匿名函数进行LiveData的非空判断,其中的it就是返回的异步数据,即信鸽带回来的信件,可以直接按上式套用,内部放使用数据的函数。
4.设置点击事件
// 分别绑定对应布局控件
val show = findViewById(R.id.show)
val buttonToWorld = findViewById(R.id.update_to_world)
val buttonToTomorrow = findViewById(R.id.update_to_tomorrow)
// 设置"明天按钮"的监听
buttonToTomorrow.setOnClickListener {
// 启动一个子线程
thread {
// 传递字符串给该LiveData
textLiveData.postValue("你好,明天")
}
}
// 设置"世界按钮"的监听
buttonToWorld.setOnClickListener {
// 启动一个子线程
thread {
// 传递字符串给该LiveData
textLiveData.postValue("你好,世界")
}
}
// 传入数据来更新LiveData的值。传参后,相当于我们给信鸽绑上信件了。
textLiveData.postValue(参数)
// 为产生异步数据,简单调用子线程的方式
thread {
// 里面放代码块,就启动了一个子线程
}
5.使用异步数据
// 启动该LiveData的观察者——等鸽人
textLiveData.observe(this, { it ->
it?.let {
// 将新的LiveData数据设置为show文本控件的文字,显示出来
show.text = it
}
})
本文简单的处理拿到的异步数据:拿到新的LiveData数据后,将其设置为show控件的文字,显示出来。
6.真机测试结果
MainActivity完整代码
class MainActivity : AppCompatActivity() {
// 此处声明LiveData数据类变量——信鸽
private val textLiveData = MutableLiveData(String())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 分别绑定对应布局控件
val show = findViewById(R.id.show)
val buttonToWorld = findViewById(R.id.update_to_world)
val buttonToTomorrow = findViewById(R.id.update_to_tomorrow)
// 设置"明天按钮"的监听
buttonToTomorrow.setOnClickListener {
// 启动一个子线程
thread {
// 传递字符串给该LiveData
textLiveData.postValue("你好,明天")
}
}
// 设置"世界按钮"的监听
buttonToWorld.setOnClickListener {
// 启动一个子线程
thread {
// 传递字符串给该LiveData
textLiveData.postValue("你好,世界")
}
}
// 启动该LiveData的观察者——等鸽人
textLiveData.observe(this, { it ->
it?.let {
// 将新的LiveData数据设置为show文本控件的文字,显示出来
show.text = it
}
})
}
}
三、布局设置
在约束布局中,简单的设置1个显示文本框、1个”明天按钮”、1个”世界按钮”。
- 文本框id设为: show
- “明天按钮”id设为: update_to_tomorrow
- “世界按钮”id设为: *update_to_world
布局XML文件的完整代码
四、补充说明
特别指出, 本文为便于演示,并未按照规范使用LiveData,如谷歌官方推荐创建LiveData的实例存储某种类型的数据时, 通常在ViewModel类中完成。LiveData的其他特性也未完全指出,如生命周期感知、使用单例模式在多个 Activity、Fragment 和 Service 之间共享数据等。
本文仅是演示LiveData能够在Activity中进行简单的运用。更全面且深入的知识敬请阅读官方文档。
如有任何疑问,请在评论区留言,我会努力回复。
demo源码 github地址:
https://github.com/darlingxyz/demo_livedata
Original: https://blog.csdn.net/qq_50920297/article/details/123921101
Author: 大风起兮呼呼呼
Title: 【Kotlin】Android-LiveData类三步处理异步数据—附demo源码
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816762/
转载文章受原作者版权保护。转载请注明原作者出处!