Bootstrap

Android LiveData的使用

前言:以下内容,均为笔者复习使用,如有笔误请联系笔者更正

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)
    }
}
;