Android JetPack组件之LiveData的使用详解

简介: Android JetPack组件之LiveData的使用详解

前言:LiveData的介绍

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

下面我们通过LiveData做一个简单的例子,来理解观察数据发生变化的功能。

一、首先引入依赖

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

二、activity_live_data_test.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".LiveDataTestActivity">
    <TextView
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="100dp"
        android:gravity="center"
        android:textSize="30sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:gravity="center"
        android:orientation="horizontal">
        <ImageButton
            android:id="@+id/img_button_add"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginRight="20dp"
            app:srcCompat="@drawable/ic_sharp_thumb_up_24" />
        <ImageButton
            android:id="@+id/img_button_subtract"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            app:srcCompat="@drawable/ic_baseline_thumb_down_24" />
    </LinearLayout>
</LinearLayout>

三、创建ViewModelWithLiveData类继承于ViewModel,在这个类里面声明变量,具体讲解已经在代码中给出

public class ViewModelWithLiveData extends ViewModel {
    //声明一个变量 MutableLiveData是容器 Integer是变量的类型
    private MutableLiveData<Integer> LikedNumber;
    public MutableLiveData<Integer> getLikedNumber() {
        if (LikedNumber == null) {
            //LikedNumber是对象类型,不是基本数据类型,所以要保证变量不是空的
            LikedNumber = new MutableLiveData<>();
            //初始化为0
            LikedNumber.setValue(0);
        }
        return LikedNumber;
    }
    public void addLikedNumber(int n) {
        LikedNumber.setValue(LikedNumber.getValue() + n);
    }
}

四、给viewModelWithLiveData里面的变量添加一个观察,点击按钮实现+1,-1操作

public class LiveDataTestActivity extends AppCompatActivity {
    private ViewModelWithLiveData viewModelWithLiveData;
    private TextView tv_text;
    private ImageButton img_button_add;
    private ImageButton img_button_subtract;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_data_test);
        tv_text = findViewById(R.id.tv_text);
        img_button_add = findViewById(R.id.img_button_add);
        img_button_subtract = findViewById(R.id.img_button_subtract);
        viewModelWithLiveData = new ViewModelProvider(this).get(ViewModelWithLiveData.class);
        //给viewModelWithLiveData里面的变量添加一个观察 观察它自己 如果数据发生变化,则呼叫下面的函数
        //observe()的第一个参数:需要具有LifeCycle管理功能的一些对象 Activity就是具有管理LifeCycle功能的对象
        //系统已经帮我们做好了,不用在其他地方取消观察 只需要添加观察就可以了。
        viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
            //当数据发生改变的时候 呼叫这个函数
            @Override
            public void onChanged(Integer integer) {
                tv_text.setText(String.valueOf(integer));
            }
        });
        img_button_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewModelWithLiveData.addLikedNumber(1);
            }
        });
        img_button_subtract.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewModelWithLiveData.addLikedNumber(-1);
            }
        });
    }
}

效果演示:

旋转屏幕,切换系统语言等配置数据不会丢失,这就是本篇内容所要介绍的内容,有不当处,可以在评论区指正哈~


目录
相关文章
|
26天前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
115 0
|
26天前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。
|
12天前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
21 2
|
22天前
|
JavaScript Java Android开发
kotlin安卓在Jetpack Compose 框架下跨组件通讯EventBus
**EventBus** 是一个Android事件总线库,简化组件间通信。要使用它,首先在Gradle中添加依赖`implementation &#39;org.greenrobot:eventbus:3.3.1&#39;`。然后,可选地定义事件类如`MessageEvent`。在活动或Fragment的`onCreate`中注册订阅者,在`onDestroy`中反注册。通过`@Subscribe`注解方法处理事件,如`onMessageEvent`。发送事件使用`EventBus.getDefault().post()`。
|
22天前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
|
25天前
|
监控 Android开发 数据安全/隐私保护
安卓kotlin JetPack Compose 实现摄像头监控画面变化并录制视频
在这个示例中,开发者正在使用Kotlin和Jetpack Compose构建一个Android应用程序,该程序 能够通过手机后置主摄像头录制视频、检测画面差异、实时预览并将视频上传至FTP服务器的Android应用
|
5天前
|
XML 存储 API
Jetpack初尝试 NavController,LiveData,DataBing,ViewModel,Paging
Jetpack初尝试 NavController,LiveData,DataBing,ViewModel,Paging
|
10天前
|
Android开发
Jetpack Compose: Hello Android
Jetpack Compose: Hello Android
8 0
|
10天前
|
搜索推荐 Android开发 开发者
Android 自定义组件
Android 自定义组件
9 0
|
11天前
|
存储 程序员 定位技术
程序员必知:安卓的四大组件
程序员必知:安卓的四大组件
11 0