前言:以下内容,均为笔者复习使用,如有笔误请联系笔者更正
1、 LiveData 是一个可观察的数据存储类, 并且具有Activity or Framgent生命周期的感知能力,livedata会将存储的数据,发送给正处于活跃的观察者observer。 前提是需要Activity or Framgent和livedata绑定。
2、使用LiveData的优势
1、不会发生内存泄露 (具有生命感知能力,当页面被关闭,观察者会自己清理)
2、不会因 Activity 停止而导致崩溃 (比如:某个异步任务执行完毕去更新ui,但是刚巧页面被关闭,这个时候去更新ui,会有null指针的发生。这只是举个例子。)
3、不再需要手动处理生命周期(livedata可以观察生命周期发生的变化)
4、数据始终保持最新状态(当Activity处于非活跃状态,比如手机屏幕锁屏,Activity不会接收消息。当屏幕解锁,Activity处于前台,会立马接收到最新消息)
5、资源共享 这个要看怎么理解,比如,一个activity或fragment并且下面又有多个fragment碎片。那么他们就可以同时使用一个livedata对象里面存储的数据(通过同一个activity或者是fragment构建一个viewModel对象)。
3、LiveData的使用
一般使用livedata会配合viewModel去使用,这也是官方推荐是方法:
请确保将用于更新界面的 LiveData 对象存在ViewModel创建,而不是将其在 Activity 或 Fragment 中创建,原因如下:
避免 Activity 和 Fragment 过于庞大。这些界面控制器负责显示数据,但不负责创建存储数据状态。
将 LiveData 实例与特定的 Activity 或 Fragment 实例分离开,并使 对象在配置更改后继续存在。
当然,如果你非要在Activity 和 Fragment 中创建livedata也不是不行,就像使用mvp或者mvvm一样,非得在Activity 和 Fragment创建m层的对象,也是可行的。但是一旦违背原则,那就是mvc 。
由于LiveData是一个抽象类,所有创建LiveData使用它的一个子类 MutableLiveData<>()。 也可以认为MutableLiveData是google为开发者提供的一个扩展类。
创建一个ViewModel类,在ViewModel类中创建livedata数据存储对象
class DemoViewModel : ViewModel() {
/**UI数据存储对象*/
val mNameLiveData: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
/**通过发送消息给观察者,观察者会回调onChanged方法*/
fun setTestName(value:Int){
//如果在子线层用使用postValue()观察者会在主线程接收到到通知
mNameLiveData.postValue(value.toString())
//当前是什么线程,观察者就在什么线程接收通知
// mNameLiveData.value = value.toString()
}
}
Activity or Fragment中使用LiveData
class MainActivity : AppCompatActivity() {
private var viewModel: DemoViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//通过ViewModelProviders获取DemoViewModel实例
viewModel = ViewModelProviders.of(this).get(DemoViewModel::class.java)
//observe 和 observeForever 两者的区别
viewModel?.mNameLiveData?.observe(this, Observer {
//关联Activity的生命周期LifecycleOwner,Activity只在活跃状态onStart or onResume 页面可见下接收通知
//当前Activity处于不可见状态,不会接收到通知,但当Activity恢复到可见状态,会立马接收最新的通知。
//在退出页面的时候,无需手动移除。观察者会自动移除
})
//observeForever
viewModel?.mNameLiveData?.observeForever(mObservable)
}
private val mObservable = Observer<String> {
//未关联Activity的生命周期,Activity任何状态下都可以收到关于修改的通知
//在退出页面的时候,需要手动调用removeObserver(mObservable)方法移除。
}
override fun onDestroy() {
super.onDestroy()
//如果使用observeForever订阅liveData, 需要手动移除mObservable观察者
viewModel?.mNameLiveData?.removeObserver(mObservable)
}
}