一、概述
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