Android ViewModel与LiveData组件组合使用详解

简介: Android ViewModel与LiveData组件组合使用详解

一、首先使用ViewModel写一个小案例,之后在此基础上,结合LiveData一起使用。

1、创建TimerViewModel类

/**
 * @Author: ly
 * @Date: 2022/9/13
 * @Description: 继承ViewModel类,将视图与数据分离
 */
public class TimerViewModel extends ViewModel {
    private Timer timer;
    private int currentSecond;
    /**
     * 开始计时
     */
    public void startTiming() {
        if (timer == null) {
            currentSecond = 0;
            timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    currentSecond++;
                    if (onTimeChangeListener != null) {
                        onTimeChangeListener.onTimeChanged(currentSecond);
                    }
                }
            };
            timer.schedule(timerTask, 1000, 1000);
        }
    }
    /**
     * 通过接口的方式,完成对调用者的通知
     * 实际上这种方式不是很好,更好的方式是通过LiveData组件来实现
     */
    public interface OnTimeChangeListener {
        void onTimeChanged(int second);
    }
    private OnTimeChangeListener onTimeChangeListener;
    public void setOnTimeChangeListener(OnTimeChangeListener onTimeChangeListener) {
        this.onTimeChangeListener = onTimeChangeListener;
    }
    @Override
    protected void onCleared() {
        super.onCleared();
        timer.cancel();
    }
}

2、在MainActivity中,通过实现接口OnTimeChangeListener ,进行数据变化的监听。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniComponent();
    }
    private void iniComponent() {
        final TextView textView = findViewById(R.id.textView);
        TimerViewModel timerViewModel = new ViewModelProvider(this).get(TimerViewModel.class);
        timerViewModel.setOnTimeChangeListener(new TimerViewModel.OnTimeChangeListener() {
            @Override
            public void onTimeChanged(int second) {
                //更新UI界面
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(String.valueOf(second));
                    }
                });
            }
        });
        timerViewModel.startTiming();
    }
}

二、将上面的案例,结合LiveData组件一起使用,这样会更方便,减少代码的冗余。

1、首先介绍一下LiveData组件

LiveData是一个可被观察的数据容器类,具体来说,可以将LiveData理解为一个数据的容器,它将数据包装起来,使数据成为被观察者,当该数据发生变化的时候,观察者就能获得通知,我们不需要自己去实现观察者模式,LiveData内部已经默认实现好了,我们只要使用就可以了。

下面我们就用LiveData取代上面所定义的OnTimeChangeListener 接口,完成ViewModel与页面之间的通信。

1、TimerWithLiveDataViewModel 类如下

/**
 * @Author: ly
 * @Date: 2022/9/1
 * @Description: LiveData是一个抽象类,不能直接使用,我们使用它的直接子类MutableLiveData
 */
public class TimerWithLiveDataViewModel extends ViewModel {
    //将currentSecond这个字段用MutableLiveData包装起来
    private MutableLiveData<Integer> currentSecond;
    private Timer timer;
    private int second = 0;
    public LiveData<Integer> getCurrentSecond() {
        if (currentSecond == null) {
            currentSecond = new MutableLiveData<>();
        }
        return currentSecond;
    }
    /**
     * 开始计时
     */
    public void startTiming() {
        if (timer == null) {
            timer = new Timer();
            second = 0;
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    currentSecond.postValue(second++);
                }
            };
            timer.schedule(timerTask, 1000, 1000);
        }
    }
    @Override
    protected void onCleared() {
        super.onCleared();
        timer.cancel();
    }
}

2、MainActivity类如下

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniComponent();
    }
        final TextView textView = findViewById(R.id.textView);
        final Button btn = findViewById(R.id.btn);
        TimerWithLiveDataViewModel timerWithLiveDataViewModel = new ViewModelProvider(this).get(TimerWithLiveDataViewModel.class);
        //得到ViewModel中的LiveData
        final MutableLiveData<Integer> liveData = (MutableLiveData<Integer>) timerWithLiveDataViewModel.getCurrentSecond();
        //通过LiveData.observe()观察ViewModel中数据的变化
        liveData.observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                //收到回调更新UI界面
                textView.setText("Time:" + integer);
            }
        });
        //重置计时器
        btn.setOnClickListener((v) -> {
            //完成对ViewModel中数据的更新
            //setValue(T) 必须在主线程中调用 ,
            // 而 postValue(T) 既可以在主线程中调用, 也可以在子线程中调用
            liveData.setValue(0);
        });
        //计时开始
        timerWithLiveDataViewModel.startTiming();
    }
}

以上是ViewModel和LiveData一起使用的最基本用法。


相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
988 2
|
存储 移动开发 数据库
构建高效Android应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第20天】 在动态演化的移动开发领域,构建一个既响应迅速又能够在用户界面保持稳定的Android应用是至关重要的。近年来,随着Android架构组件的推出,特别是LiveData和ViewModel的引入,开发者得以更有效地管理应用状态并优化用户界面的响应性。本文将深入探讨LiveData和ViewModel的实现机制,并通过案例分析展示如何结合它们来构建一个高效且健壮的Android应用架构。我们将重点讨论如何通过这些组件简化数据绑定过程、提高代码的可维护性和测试性,同时确保用户界面的流畅性。
381 4
|
数据库 Android开发 开发者
实现高效安卓应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第19天】 在构建响应式的Android应用程序时,LiveData和ViewModel是两个核心组件。它们不仅提供了数据持有和界面更新的机制,还促进了组件间的解耦。本文将深入探讨如何通过结合LiveData和ViewModel来优化应用架构,提升用户体验,并确保数据的一致性和生存期管理。我们将透过实际案例分析,揭示这些技术如何协同工作以应对复杂的UI场景,并展示如何在实际项目中实施这些最佳实践。
|
存储 移动开发 数据处理
构建高效安卓应用:探究LiveData和ViewModel的实践之路
【4月更文挑战第12天】 在动态演化的移动开发世界中,Android平台的UI架构经历了多次革新。近年来,随着Jetpack组件的推广,LiveData和ViewModel成为了开发者们提升应用响应性和稳定性的有力工具。本文将深入探讨这两项技术的核心原理、实现细节及其在实际项目中的协同运用,旨在为读者提供一份清晰、实操性强的技术指南,帮助开发者构建出既符合现代用户体验又具备高效数据管理的Android应用。
303 0
|
设计模式 移动开发 安全
构建高效Android应用:探究LiveData的优势与实践
【4月更文挑战第7天】随着移动开发技术的不断演进,Android开发者面临着构建更加高效、响应式和可维护应用的挑战。在众多解决方案中,LiveData作为一种观察者模式的实现,已经成为Google推荐的数据持有架构组件。本文将深入探讨LiveData的核心优势,通过具体实例展现其在Android应用中的实现方式,并分析其如何简化UI组件与数据源之间的通信,提升应用的健壮性和可测试性。
|
移动开发 前端开发 数据管理
构建高效Android应用:采用MVVM架构与LiveData的全面指南
在移动开发领域,构建一个既快速又可靠的应用对于开发者来说至关重要。随着Android Jetpack组件的推出,MVVM(Model-View-ViewModel)架构和LiveData已成为实现响应式、可测试且易于维护应用的首选解决方案。本文将深入探讨如何在Android应用中实施MVVM模式,以及如何利用LiveData来优化UI组件的数据更新流程,确保用户界面与业务逻辑之间的高度解耦和流畅交互。
467 4
|
Android开发 Kotlin
android开发,使用kotlin学习LiveData
android开发,使用kotlin学习LiveData
388 1
|
Android开发 Kotlin
android开发,使用kotlin学习ViewModel
android开发,使用kotlin学习ViewModel
490 0
|
缓存 API Android开发
安卓现代化开发系列——传世不朽ViewModel
安卓现代化开发系列——传世不朽ViewModel
566 0
|
算法 Java Android开发
Android rxjava和LiveData中的内存泄漏
Android rxjava和LiveData中的内存泄漏
531 0

热门文章

最新文章