> 文章列表 > Android LiveData基本使用及注意点

Android LiveData基本使用及注意点

Android LiveData基本使用及注意点

LiveData简介

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"// ViewModelimplementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"// LiveDataimplementation "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

LiveData有几种使用方式

        1,使用LiveData(一般使用MutableLiveData)

        2,继承LiveData类

使用LiveData子类对象MutableLiveData

这里不配合ViewModel使用,也就是把Livedata单独放在Model中

编写一个model类,类中定义MutableLiveData变量,具体如下

class LDModel {var ld:MutableLiveData<String> = MutableLiveData();companion object{private var sInstance: LDModel? = null@Synchronizedfun 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布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ld.LDActivity"><TextViewandroid:id="@+id/tv_binding_ld"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="默认显示"tools:ignore="MissingConstraints" /></androidx.constraintlayout.widget.ConstraintLayout>

问题

问题: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即可配合使用,异常解除

Livedata版本

Lifecycle  |  Android 开发者  |  Android Developers

Kotlin版本KTX

Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。