首页 > 其他分享 >Jetpack-ViewModel+LiveData+DataBinding

Jetpack-ViewModel+LiveData+DataBinding

时间:2024-10-10 22:22:51浏览次数:10  
标签:绑定 Jetpack ViewModel LiveData viewModel DataBinding 数据 textView

1.ViewModel

解决问题:

  • 瞬态数据丢失
  • 异步调用内存泄漏
  • 类膨胀提高维护难度和测试难度

作用:

  • 介于View视图和Model数据模型之间桥梁
  • 使视图和数据能够分离,也能保持通信
public class MainActivity extends AppCompatActivity {

    private TextView textView;

    private  MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);
        textView.setText(String.valueOf(viewModel.number));
    }

    public void plusNumber(View view) {
        textView.setText(String.valueOf(++viewModel.number));
    }
}
public class MyViewModel extends ViewModel {

    public int number;

}

2.LiveData

LiveData是Android架构组件中的一部分,用于在数据源和UI之间建立连接,实现数据的实时更新和同步。它允许观察者(例如Activity或Fragment)订阅数据变化,并在数据发生变化时自动更新UI。

  • 基本概念:LiveData是一个可观察的数据持有者类,它遵循观察者模式。这意味着它可以持有数据,并且当数据发生变化时,它会通知所有已订阅的观察者。这在处理生命周期相关的数据时非常有用,因为它可以确保只有当活动或片段处于激活状态时,才会接收到更新。
  • 工作原理:LiveData的核心是LifecycleOwner,通常是Activity或Fragment。当LiveData对象有新数据时,它会检查是否有活跃的观察者,并通知它们。如果观察者已经销毁,如Activity已经停止或Fragment已经分离,那么LiveData就不会再发送通知,从而避免了内存泄漏。
  • 使用步骤:要使用LiveData,首先需要在项目的build.gradle文件中添加依赖。然后,可以在ViewModel中创建LiveData对象,并在UI层(如Activity或Fragment)中观察它。当LiveData对象的数据改变时,UI会自动更新。
  • 应用场景:LiveData适用于多种场景,包括但不限于配置更改、网络状态变化、数据库操作等。它特别适用于需要响应配置更改(如屏幕旋转)的场景,因为在这些情况下,观察者可能会被销毁并重新创建,而LiveData能够确保在这些过程中不会发生内存泄漏。
  • 双向绑定:虽然LiveData本身不直接支持双向绑定,但可以与DataBinding库结合使用,通过将LiveData对象与UI元素绑定来实现双向绑定的效果。
  • 数据更新:当LiveData中的数据发生变化时,所有订阅了该LiveData的观察者都会收到通知,从而实现UI的自动更新。
  • 事件处理:LiveData还提供了Transformations API,允许开发者对LiveData对象进行转换和组合,以实现更复杂的数据处理逻辑。
  • 高级功能:除了基本的数据持有和通知功能外,LiveData还提供了一些高级功能,如切换地图类型、设置筛选条件等,这些功能使得LiveData更加灵活和强大。
public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> currentSecond;

    public MutableLiveData<Integer> getCurrentSecond()
    {
        if (currentSecond == null)
        {
            currentSecond = new MutableLiveData<>();
            currentSecond.setValue(0);
        }
        return currentSecond;
    }
}
public class MainActivity extends AppCompatActivity {

    private TextView textView;

    private MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);
        textView.setText(String.valueOf(viewModel.getCurrentSecond()));

        viewModel.getCurrentSecond().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });
        startTimer();
    }

    private void startTimer(){
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                // 非ui线程 postValue
                // ui线程 setValue
                viewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().getValue()+1);
            }
        },1000,1000);
    }
}

3.DataBinding

Android DataBinding是Google在Jetpack中推出的一款数据绑定的支持库,它通过将数据源直接与UI元素进行绑定来实现数据与视图之间的自动更新。
对DataBinding的详细介绍:

  • 基本概念:DataBinding是一种强大的数据绑定技术,它能够实现视图和数据之间的自动更新。开发者可以将数据直接绑定到视图上,从而简化了视图和数据之间的操作,提高了代码的可读性和可维护性。
  • 工作原理:DataBinding的工作原理主要依赖于数据绑定引擎和数据对象。数据绑定引擎负责管理数据和视图之间的关系,当数据发生变化时,引擎会自动更新视图。而数据对象则是数据的载体,它可以是任何对象,只要实现了相应的数据接口。
  • 使用步骤:启用DataBinding需要在app module的build.gradle中添加相应代码。布局文件需要更改为layout节点并引入data节点,同时创建好需要用到的Model。在Activity或Fragment中,用DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定。
  • 应用场景:列表展示、条件渲染、数据绑定布局、MVVM架构等都是DataBinding的应用场景。DataBinding与MVVM架构相结合,可以实现更好的代码分离和组件化开发。
  • 双向绑定:双向绑定的效果是数据影响界面,界面变化也要使得数据发生变化。例如EditText输入内容时,绑定的数据bean要跟着变化。
  • 数据更新:Databinding通过使用实现Observable的数据,当数据更新的时候,自动更新UI。监听对象变化更新。
  • 事件处理:事件处理包括方法引用和监听绑定两种方式。
  • 高级功能:DataBinding支持在普通方法上添加@注解来添加自定义控件属性。这提供了更大的灵活性,允许开发者根据需要定制控件的行为
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        Idol idol = new Idol("蔡徐坤", "五星");
        binding.setIdol(idol);

    }
}
<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <data>
        <variable
            name="idol"
            type="com.zzzjian.databinding.Idol" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="365dp" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="300dip"
            android:layout_height="300dip"
            android:contentDescription="TODO"
            app:layout_constraintBottom_toTopOf="@+id/guideline"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:src="@drawable/ikun"
            app:layout_constraintTop_toTopOf="parent"
            tools:src="@tools:sample/avatars" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="姓名"
            android:text="@{idol.name}"
            android:textSize="24sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline"
            app:layout_constraintVertical_bias="0.245" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="五星"
            android:text="@{idol.star}"
            android:textSize="24sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

标签:绑定,Jetpack,ViewModel,LiveData,viewModel,DataBinding,数据,textView
From: https://blog.csdn.net/qq_63140630/article/details/142758918

相关文章

  • Databinding(kotlin)
    简单使用(只作为view获取)build.gradle.kts配置android{dataBinding{enable=true}}activity注入//setContentView(R.layout.activity_main)valbinding:ActivityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main......
  • Jetpack Compose 基本布局(7)
    导读大纲1.1探索基本布局1.1.1布局介绍1.1.2定位和尺寸的修改器1.2组合可组合元素1.2.1在布局内组合可组合元素1.2.2组织可组合元素的最佳实践1.2.3真实世界的场景1.1探索基本布局布局是JetpackComposeUI的支柱它们提供在屏幕上组织和排列可组合......
  • 带你了解Android Jetpack库中的依赖注入框架:Hilt
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点Hilt概述Hilt是Google推出的一种用于Android的依赖注入(DependencyInjection,DI)框架,构建于Dagger之上,旨在简化Android应用中的依赖注入过程。通过Hilt,你可以更轻松......
  • 聊一下Jetpack AppStartUp的使用和原理。
    AppStartup是AndroidJetpack中的一个库,用于在应用启动时初始化组件,能简化启动序列并显式设置初始化依赖顺序,从而提高应用的启动速度。以下是关于AppStartup的使用和原理的介绍:使用方法添加依赖:在项目的模块级build.gradle文件中添加对AppStartup的依赖。implementatio......
  • WPF-Prism中View和ViewModel的关联
    1、在MainWindow.xaml中进行Prism命名空间的引入以及ViewModelLocator.AutoWireViewModel属性的设置需要注意,AutoWireViewModel默认就是为True,表示自动关联ViewModel,因此这个命名空间引入以及设置属性的步骤是可以省略的2、通过ViewModelLocator进行View与ViewModel层的自动关......
  • Jetpack业务架构—四件套(Lifecycle、ViewModel、LiveData、DataBinding)
            Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。1. AndroidJetpack组件的优势:        Jetpack推出的主要目的是为了能够......
  • Jetpack架构组件学习(5)——Hilt 注入框架使用
    原文:Jetpack架构组件学习(5)——Hilt注入框架使用-Stars-One的杂货小窝本篇需要有Kotlin基础知识,否则可能阅读本篇会有所困难!介绍说明实际上,郭霖那篇文章已经讲得比较明白了(具体参考链接都贴在下文了),这里简单总结下:如果按照之前我们的MVC写法,我们可以直接在activ......
  • Jetpack Compose学习(13)——Compose生命周期及副作用函数
    原文:JetpackCompose学习(13)——Compose生命周期及副作用函数-Stars-One的杂货小窝此文建议需要了解kotlin的lambda表达式使用和协程基础使用,不然可能会有些阅读困难本篇算是参考他人文章,按照自己理解重新总结了下吧,偏理论生命周期Composable组件都是函数,Composable......
  • Prism视图模型定位器(ViewModelLocator)
    视图模型定位器(ViewModelLocator)依照“标准命名约定”将视图(View)中的数据上下文链接到视图模型(ViewModel)的实例。自动绑定视图模型Prism视图模型定位器(ViewModelLocator)有一个AutoWireViewModel属性:当设置为true时,AutoWireViewModelChanged事件调用类中的ViewMod......
  • Android 将 ViewModel 和 Compose界面的数据 双向绑定
    简介双向绑定说白了就是达到下面的效果:ViewModel能够实时传输从Room数据库查询到的数据到Compose页面。Compose页面能实时传输用户输入的数据到ViewModel类。需要分别在ViewModel和Compose中操作。一、在ViewModel中:1、使用mutableStateOf家族定义一个可变的值(......