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

发布时间 2023-08-11 11:57:54作者: 飘杨......

一、概述

 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) {

}

  测试结果: