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"

        // 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

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

        @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布局

<?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">

    <TextView
        android: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 代码。

猜你喜欢

转载自blog.csdn.net/ezconn/article/details/130190381