Android Jetpack组件LiveData基本使用和原理分析

本文深入探讨了Android Jetpack中的LiveData,介绍了其作为可观察数据存储器的基本概念,以及如何与生命周期关联。通过示例展示了LiveData的使用,并提出了关于其工作原理的问题。接着,文章逐步解析了LiveData的源码,特别是MutableLiveData、observe方法、LifecycleBoundObserver和ObserverWrapper等关键部分,解答了LiveData如何回调、感知生命周期及其优势。最后总结了LiveData的主要优势,包括自动处理生命周期、防止内存泄漏和确保界面与数据状态同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LiveData一般是和 ViewModel 配合使用的,但是本文就以单独使用 LiveData 作为例子单独使用,这样可以只关注 LiveData 而不被其他所干扰。

本文整体流程:首先要知道什么是 LiveData,然后演示一个例子,来看看 LiveData 是怎么使用的,接着提出问题为什么是这样的,最后读源码来解释原因!

LiveData 的源码比较简单,底层依赖了 Lifecycle,所以懂 Lifecycle 的源码是关键,我之前写过一篇

Android Jetpack组件Lifecycle基本使用和原理分析 最好是先看这篇文章,才能更好的理解 LiveData。

1.什么是 LiveData

LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

2.LiveData基础使用的例子

这个例子,是点击按钮通过 LiveData 来更新 TextView 的内容

如图:
在这里插入图片描述

点击按钮后
在这里插入图片描述

具体代码

class LiveDataActivity : BaseActivity() {
   
    private val mContent = MutableLiveData<String>()
    
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_live_data)

        btnUpdate.setOnClickListener {
   
            mContent.value = "最新值是:Update"
        }

        mContent.observe(this, Observer {
    content ->
            tvContent.text = content
        })
    }
}
<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvContent"
        android:layout_width="0dp"
        android:text="Hello World"
        android:layout_height="wrap_content"
        android:textColor="#f00"
        android:gravity="center"
        android:textSize="24sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnUpdate"
        android:layout_width="wrap_content"
        android:text="Update"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:textSize="18sp"
        android:layout_marginTop="20dp"
        android:textAllCaps="false"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvContent" />

</androidx.constraintlayout.widget.ConstraintLayout>

默认TextView展示的是: Hello World,点击按钮后展示的是:“最新值是:Update” 。这个就是LiveData 的简单使用。

3.抛出问题

为什么LiveData的工作机制是这样的

  • LiveData 是怎么回调的?
  • LiveData 为什么可以感知生命周期?
  • LiveData 可以感知生命周期,有什么用,或者说有什么优势?
  • LiveData 为什么只会将更新通知给活跃的观察者。非活跃观察者不会收到更改通知?
  • LiveData此外还提供了observerForever()方法,所有生命周期事件都能通知到,怎么做到的?

解析来通过分析源码,来寻找答案。文章最后我会解释这些问题的,做一个统一的总结。

4.源码分析前的准备工作

我需要了解几个类,来对接下来的源码分析做一个铺垫。

先看之前例子中的代码

class LiveDataActivity : BaseActivity() {
   
    private val mContent = MutableLiveData<String>()
  	
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
				
        mContent.observe(this, Observer {
    content ->
            tvContent.text = content
        })
    }
}

只贴出了主要代码,我们来看下主要的类以及方法,方法参数

  • 声明了一个MutableLiveData对象
  • 调用了MutableLiveData的observe方法
  • observe方法中 传入 this 和 Observer
  • this 指的是LiveDataActivity对象,其实一个是一个LifecycleOwner。Observer是一个接口

来分别看下具体内容。

4.1.MutableLiveData类
public class MutableLiveData<T> extends LiveData<T> {
   

    public MutableLiveData(T value) {
   
        super(value);
    }

    public MutableLiveData(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值