android jetpack总结

ViewModel

视图与数据模型之间的桥梁。

重要方法
onCleared() //用来释放资源。当ViewModel不再被需要,即与之相关的Activity都被销毁时,该方法会被系统调用。

实例化

ViewModel 一般和页面对应,具体取决于我们构建参数。
通过如下方法构建
ViewModelProvider(owner, factory).get(modelClass)
根据ViewModelStoreOwner 像activity,fragment都可以获取到(注意不同)。如果使用同一个ViewModel需要相同的 owner.
利用此,可以实现Fragment之间或与Activity的交互。

不要在ViewModel中,持有Context对象,可能会引起内存泄漏。如果需要可使用Application作为Context。

参考资料

Android架构之ViewModel组件

Livedata

LiveData 是一个可被观察的数据持有类。与普通的被观察者(如 RxJava 中的 Observable)不同的是,LiveData 是生命周期感知的,也就是说,它能感知其它应用组件(ActivityFragmentService)的生命周期。这种感知能力可以确保只有处于 active 状态的组件才能收到 LiveData 的更新。
LiveData 是一个抽象类,我们不能直接使用。我们可以使用它的子类:MutableLiveData MediatorLiveData
MutableLiveDataLiveData 的一个最简单实现,它可以接收数据更新并通知观察者.
重要方法:

  • postValue(T value) //在子线程调用
  • setValue(T value) //需要确保执行在主线程
  • observe(LifecycleOwner owner, Observer<? super T> observer) //监听数据的变化

LifecycleOwner对应activityfragment等,这也是Livedata感知生命周期的关键。

	class MutableLiveDataFragment : Fragment() {

	//监听回调
    private val changeObserver = Observer<String> { value ->
        value?.let { txt_fragment.text = it }
    }

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        liveDataA.observe(this, changeObserver)
    }
    // .. some other Fragment specific code ..
}
  

MediatorLiveData 可以将多个LiveData源数据集合起来。监听多个LiveData的数据变化。

class MediatorLiveDataFragment : Fragment() {

    private val changeObserver = Observer<String> { value ->
        value?.let {
            txt_fragment.text = it
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_mediator_live_data, container, false)
    }

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        val mediatorLiveData = MediatorLiveData<String>()
        mediatorLiveData.addSource((activity as MediatorLiveDataActivity).liveDataA) { mediatorLiveData.value = "A:$it" }
        mediatorLiveData.addSource((activity as MediatorLiveDataActivity).liveDataB) { mediatorLiveData.value = "B:$it" }
        mediatorLiveData.observe(this, changeObserver)
    }
}

另外,还有 Transformations#map() 可以变换,LiveDataA -> LiveDataB.
Transformations#switchMap 可以切换 LiveData的监听。

参考资料:
LiveData使用详解
LiveData Demo地址


版权声明:本文为ti_an_1989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。