LiveData也是Jetpack中的一个组件,是一个可被观察的数据持有类,具有Activity/Fragment/Server生命周期感知的(即当处于活跃状态下才可以接收数据的更新),类似于观察者设计模式,LiveData是被观察者,Activity/Fragment/Service为观察者,例如在Activity中注册观察者,当被观察发生改变时,观察能收到改变;
LiveData只有当观察者的生命周期处于活跃状态时才会去通知观察者。
实现了Observer类的观察者,可以注册监听LiveData;活跃状态就是指处于STARTED或者RESUMED状态;处于非活跃的观察者,LiveData不会去通知这些观察者;LivaData是个抽象类,常用的子类有MutableLiveData
使用Livedata是注意自定义Activitiy不能直接继承SDK中的Activity,需要继承AppCompatActivity;不然后面是使用Livedata时,达不到预期的效果,通过Livedata的observe方法注册使用可能会导致Livedata不能感知Activity生命周期的变化;
AndroidStudio重要导入Androidx中的livecycle包的livedata子包
Lifecycle | Android 开发者 | Android Developers 添加以下依赖,目前是最新的版本,如果想使用其他版本,点击此链接进入官方文档查看
def lifecycle_version = "2.5.1"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
// implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
LiveData 概览 | Android 开发者 | Android Developers
1,使用LiveData(一般使用MutableLiveData)
2,继承LiveData类
使用LiveData子类对象MutableLiveData
这里不配合ViewModel使用,也就是把Livedata单独放在Model中
编写一个model类,类中定义MutableLiveData变量,具体如下
class LDModel {
var ld:MutableLiveData = MutableLiveData();
companion object{
private var sInstance: LDModel? = null
@Synchronized
fun getInstance(): LDModel? {
if (sInstance == null) {
sInstance = LDModel()
}
return sInstance
}
}
}
Activity中注册观察者
class LDActivity : AppCompatActivity() {
val tv_binding_ld:TextView by lazy { findViewById(R.id.tv_binding_ld) }
val TAG: String = "LDActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ld)
LDModel.getInstance()?.ld?.observe(this){
tv_binding_ld.setText(it)
}
createData()
}
fun createData(){
//延迟5s刷新Livedata中的数据
Handler().postDelayed({
LDModel.getInstance()?.ld?.value = "LiveData中的数据"
}, 5000)
}
}
XML布局
问题:Execution failed for task ‘:app:kaptDebugKotlin’.
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
java.lang.reflect.InvocationTargetException (no error message)
原因:Livedata最新版2.5.1需要最低
compileSdkVersion 31
但是如果升级compileSdkVersion 和targetSdkVersion会导致其他依赖库升级,如果不升级可能会导致出现以上错误;
解决办法;1,升级compileSdkVersion 和 targetSdkVersion,并升级其他依赖库;
2,降低livedata和viewmodel版本号,具体看个人项目的compileSdkVersion和targetSdkVersion版本要livedata和Viewmodel版本匹配即可;
比如compileSdkVersion 29 livedata 2.3.1即可配合使用,异常解除
Lifecycle | Android 开发者 | Android Developers
Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。