LiveData
一、LiveData
是一个可被观察的数据持有者,它是具有生命周期感知的数据持有者,只会通知处于Active状态的观察者。
LiveData是一个抽象类,最简单的实现者MutableLiveData
1、基本使用
通过调用LiveData的observer方法,注册观察者
MutableLiveData<String> mutableLiveData = new MutableLiveData<>(); mutableLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable final String s) { Log.d(TAG, "onChanged1:"+s); } });
更新数据,会回调observer的onchanged方法
mutableLiveData.postValue("Android进阶之光");
2、LiveData如何观察生命周期
LiveData的observe方法如下所示
@MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { assertMainThread("observe"); //如果被观察者的当前的状态是DESTROYED,就return if (owner.getLifecycle().getCurrentState() == DESTROYED) {//1 return; } LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);//2 ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);//3 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);//4 }
注释1处的owner实际上就是注册时传进来来组件,比如Activity,获取组件当前的状态,如果状态为DESTROYED,那么直接return,这说明DESTROYED状态的组件是不允许注册的。
3、postValue/setValue方法分析
@MainThread //3 protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData = value; dispatchingValue(null); }
dispatchingValue 会调用considerNotify方法
private void considerNotify(ObserverWrapper observer) { if (!observer.mActive) {//1 return; } if (!observer.shouldBeActive()) { observer.activeStateChanged(false);//2 return; } if (observer.mLastVersion >= mVersion) { return; } observer.mLastVersion = mVersion; //noinspection unchecked observer.mObserver.onChanged((T) mData);//3 }
最终会回调LiveData的observer的onchanged方法
参考:Android Jetpack架构组件(五)一文带你了解LiveData(原理篇) - 掘金 (juejin.cn)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现