Android(安卓)Jetpack -- ViewModel & LiveData
看到这些博客的时候,相信小伙伴们已经看了不少的有关于Android Jetpack的知识了,关于Jetpack的原理,有些文章讲的很好,这里就不重复了,此系列的博客,旨在通过一些很简单的小demo,和大家一起熟悉最基本的用法~
Android Jetpack -- Lifecycle
Android Jetpack -- ViewModel & LiveData
Android Jetpack -- paging & room
Android Jetpack -- navigation
项目git地址:https://github.com/zhangtiansimple/jetpack_demo
------------------------------------------------------------------------------------------------------------------------
因为LiveData和ViewModel的关系非常紧密,LIveData通常也声明在ViewModel里,所以将这两个组件放在一篇博客里来分享。
还是先来看一个小栗子
class MyViewModel() : ViewModel() { private var title: MutableLiveData? = null public fun getTitle(): MutableLiveData { if (title == null) { title = MediatorLiveData() loadTitle() } return title as MutableLiveData } private fun loadTitle() { title!!.setValue("load title success") }}
MutableLiveData继承自LiveData
public class MutableLiveData extends LiveData { @Override public void postValue(T value) { super.postValue(value); } @Override public void setValue(T value) { super.setValue(value); }}
在ViewModel里将LiveData的实例接口暴露出去,在需要的视图里进行调用
class ViewModelActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_viewmodel) viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java) viewModel.getTitle().observe(this, Observer { tv_viewmodel.setText(it) }) }}
在Activity里获取viewModel的实例后,直接使用LiveData里的观察方法,当数据有变化的时候,直接进行UI的更新,使用起来是不是非常方便。
接下来看看LiveData的observer()方法
@MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { assertMainThread("observe"); if (owner.getLifecycle().getCurrentState() == DESTROYED) { // ignore return; } LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); if (existing != null && !existing.isAttachedTo(owner)) { throw new IllegalArgumentException("Cannot add the same observer" + " with different lifecycles"); } if (existing != null) { return; } owner.getLifecycle().addObserver(wrapper); }
在这个方法中主要做了三件事
1.如果LifeCycle的状态是DESTROYED时,直接返回,不用接收新的数据。
2.声明一个LifeCycleBoundObserver对象建立了LifeCycleOwner和Observer的联系。
3.观察LifeCycleBoundObserver的实例
那么LifeCycleBoundObserver是用来做什么的呢
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver { @NonNull final LifecycleOwner mOwner; LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) { super(observer); mOwner = owner; } @Override boolean shouldBeActive() { return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); } @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { if (mOwner.getLifecycle().getCurrentState() == DESTROYED) { removeObserver(mObserver); return; } activeStateChanged(shouldBeActive()); } @Override boolean isAttachedTo(LifecycleOwner owner) { return mOwner == owner; } @Override void detachObserver() { mOwner.getLifecycle().removeObserver(this); } }
该方法主要作用是添加移除观察者,并且在生命周期发生变化时回调onStateChanged。
LiveData和ViewModel的简单使用就介绍到这里,系列文章都是科普性的,深入实践就需要小伙伴们在实践中不断的总结学习了。
更多相关文章
- Android(安卓)SurfaceView+MediaPlayer实现几个不同的视频轮流播
- android Popwindow中spinner点击崩溃挂掉的解决方法
- Android编程之关闭当前程序
- Android(安卓)Fragment 基本介绍
- Android(安卓)连接Wifi和创建Wifi热点的实例
- android ImageView实现上面圆角下面直角(xml实现方法)
- android输入法问题
- [置顶] Android(安卓)WebView 踩过的坑
- 你需要了解下Android(安卓)View的更新requestLayout与重绘invali