首页 > 其他分享 >简单介绍LiveData、ViewModel以及使用二者封装一个简单的基类用于测试

简单介绍LiveData、ViewModel以及使用二者封装一个简单的基类用于测试

时间:2023-08-11 12:01:10浏览次数:69  
标签:基类 ViewModel LiveData override Activity fun 数据

一、概述

 1.LiveData概述 

什么事LiveData?
    1.LiveData是一种可观察的数据存储器类
    2.LiveData是一个数据持有者,给源数据包装一层。
    3.源数据使用LiveData包装后,可以被observer观察,数据有更新时observer可感知。
    4.但observer的感知,只发生在(Activity/Fragment)活跃生命周期状态(STARTED,RESUMED,PAUSED)。

LiveData的特点:
    1.确保界面符合数据状态,当生命周期状态变化时,LiveData通知Observer,可以在observer中更新界面。观察者可以在生命周期状态更改时刷新界面,而不是在每次数据变化时刷新界面。
    2.不会发生内存泄漏,observer会在LifecycleOwner状态变为DESTROYED后自动remove。
    3.不会因 Activity 停止而导致崩溃,如果LifecycleOwner生命周期处于非活跃状态,则它不会接收任何 LiveData事件。
    4.不需要手动解除观察,开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。
    5.数据始终保持最新状态,数据更新时 若LifecycleOwner为非活跃状态,那么会在变为活跃时接收最新数据。例如,曾经在后台的 Activity 会在返回前台后,observer立即接收最新的数据。

  2.ViewModel概述

ViewMoel是什么?
    答:Android中的ViewModel是一个可以用来存储UI相关的数据的类

ViewModel的特点:
    1、当Activity、Fragment因为配置项发生改变重新生成时,界面数据就会丢失,尽管可以使用onSaveInstanceState()保存数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。而ViewModel可以很好地处理该情况下数据地保存。
    2、当不同Fragment想公用一套Activity的数据时,ViewModel可以很好地支持这种情况。
    3、ViewModel简化了Activity、Fragment的处理逻辑,使整个框架更加优美。

 

二、代码示例

  1.封装一个LiveData+ViewModel的基类并测试

  BaseActivity.kt

/**
 * Activity基类
 */
open abstract class BaseActivity<VM : BaseViewModel<T>, T> : AppCompatActivity(), Observer<T> {
    var mModel: VM? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (mModel == null) {
            mModel = createViewModel()
        }
        mModel?.getLiveData()?.observe(this, this)

    }

    override fun onChanged(t: T) {
        onDataChanged(t)
    }

    /**
     * 创建ViewModel
     */
    open abstract fun createViewModel(): VM

    /**
     * 监听数据变化
     */

    open abstract fun onDataChanged(t:T)
}

  BaseViewModel.kt

/**
 * ViewModel基类
 */
open class BaseViewModel<T>(application: Application) : AndroidViewModel(application) {
    //创建LiveData
    private var mLiveData: MutableLiveData<T> = MutableLiveData()

    /**
     * 给LiveData,设置数据
     */
    fun setLiveData(t:T){
        mLiveData.value = t
    }

    /**
     * 获取LiveData数据
     */
    fun getLiveData(): MutableLiveData<T> {
        return mLiveData
    }

    override fun onCleared() {
        KLog.e("onCleared")
        super.onCleared()
    }
}

  TestActivity用于测试/**

 * 测试LiveData+ViewModel的基类
 */
class TestActivity : BaseActivity<PersonUserModel, AccountBean>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)
        btnTestBase.setOnClickListener {
mModel?.setLiveData(AccountBean("杨洛峋小宝宝", 5)) } } override fun createViewModel(): PersonUserModel { return ViewModelProvider( this, ViewModelProvider.AndroidViewModelFactory.getInstance(ContextUtils.getApplicationContext()) ).get(PersonUserModel::class.java) } override fun onDataChanged(t: AccountBean) { KLog.e("已收到数据变化:${t.name} ${t.age}") } }

  PersonUserModel继承BaseViewModel

class PersonUserModel(application: Application) : BaseViewModel<AccountBean>(application) {

}

  测试结果:

 

标签:基类,ViewModel,LiveData,override,Activity,fun,数据
From: https://www.cnblogs.com/tony-yang-flutter/p/17622672.html

相关文章

  • LiveData的用法
    一.实时数据LiveData在上一节中,我们学习了ViewModel,了解到ViewModel的主要作用是存放页面所需要的各种数据。我们在示例代码中定义了接口,当数据发生变化的时候,采用接口的方式实现对页面的通知。但是这种方式是有缺陷的,当要存储的数据非常多的时候,就要定义大量的接口,代码会显......
  • ViewModel
    一.视图和数据模型之间的桥梁ViewModel在页面(Activity/Fragment)功能较为简单的情况下,通常会把UI交互,与数据获取等相关的业务逻辑全部写在页面中。但是在页面功能复杂的情况下,这样做是不合适的,因为它不符合“单一功能原则”。页面应该只负责处理用户和UI控件的交互,并将数据......
  • 理解面向对象 谁调用基类 谁self.data里就被yaml中类 赋值
    classBaseAPI:#基类相当于动物类;登录属于继承类,相当于老虎类#属性def__init__(self,token=None):#店铺类,订单类,支付模块等都需要使用token所以过滤一下iftoken:#如果接口需要token店铺类,订单类,支付模块等都需要使用token......
  • 【转载】父类(基类)的虚析构函数
    【推荐】基类建议使用虚析构函数,其子类、孙类不使用虚析构。当一个类不作为基类使用时,不建议使用虚析构函数,虚析构函数会增加一个虚函数表指针的长度,从而增加类对象的占用空间【具体现象】1、基类析构函数不定义为虚析构,当我们用基类指针指向子类对象的时候,只会调用基类析......
  • 什么是java中输出流的基类
    什么是Java中输出流的基类概述在Java中,输出流是用来将数据从程序输出到各种目标的流。它是一种用于写入数据的抽象类,是JavaI/O库的一部分。Java中的输出流类众多,但它们都是从一个基类继承而来的。了解输出流的基类是理解和使用Java输出流的关键。本文将向你介绍Java中输出流的基......
  • C++ 虚基类
    虚基类(VirtualBaseClass)在面向对象编程中的作用是解决多重继承中的菱形继承问题(DiamondInheritanceProblem)和共享基类问题(SharedBaseClassProblem)。菱形继承问题是指当一个类以多种路径继承自同一个基类时,会导致该基类在派生类中存在多个实例,造成冗余和二义性。虚基类通过......
  • SavedStateHandle的介绍----ViewModel不具备保存状态数据的功能
    LiveData本身不能在进程销毁中存活,当内存不足时,Activity被系统杀死,ViewModel本身也会被销毁。为了保存LiveData的数据,使用SavedStateHandle。事故场景:进程销毁后,重新去通过ViewModel去获取LiveData数据,获取到的数据是null。这表示ViewModel不具备onSavedInstance的功能。 ......
  • Transform LiveData
    查询资料的其中一个场景:创建一个回调函数,当查询后台的时候,后台有结果了,回调对应的回调函数,并将结果保存到LiveData中。publicclassDataModel{    ...    publicMutableLiveData<List<Repo>>searchRepo(Stringquery){        finalMutableLiveData<......
  • 怎样优雅地增删查改(四):创建通用查询基类
    @目录创建通用查询抽象层创建通用查询应用层基类创建通用查询控制器基类[可选]替换RESTfulApi扩展泛型参数服务的“渐进式”使用上一章我们实现了Employee管理模块,Employee的增删改查是通过其应用服务类,继承自Abp.Application.Services.CrudAppService实现的。我们将封装通用的......
  • 79.如果想将某个类用作基类,为什么该类必须定义而非声明?
    79.如果想将某个类用作基类,为什么该类必须定义而非声明?派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。所以必须定义而非声明。参考资料来源:阿秀......