当前位置:网站首页>LiveData 记录下 +
LiveData 记录下 +
2022-08-03 06:34:00 【清风徐来辽】
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
使用 LiveData 的优势
转自 LiveData 概览 :https://developer.android.google.cn/topic/libraries/architecture/livedata
- 确保界面符合数据状态
LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。 - 不会发生内存泄漏
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。 - 不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。 - 不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。 - 数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。 - 适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment,它会立即接收最新的可用数据。 - 共享资源
您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。如需了解详情,请参阅扩展 LiveData。
使用
public class BookChargeVM extends AndroidViewModel {
private MutableLiveData<Boolean> initReuslt = new MutableLiveData();
public BookChargeVM(@NonNull Application application) {
super(application);
}
public LiveData<Boolean> getInitResult() {
return this.initReuslt;
}
}
更新
public class BookChargeVM extends AndroidViewModel {
private MutableLiveData<Boolean> initReuslt = new MutableLiveData();
public BookChargeVM(@NonNull Application application) {
super(application);
}
public LiveData<Boolean> getInitResult() {
return this.initReuslt;
}
public void setInitReuslt(Boolean b) {
initReuslt.setValue(b);
}
public void postInitReuslt(Boolean b) {
initReuslt.postValue(b);
}
}
调用 setValue(T) 方法以从主线程更新 LiveData 对象。如果在工作器线程中执行代码,您可以改用 postValue(T) 方法来更新 LiveData 对象。
转换
Transformations : https://developer.android.google.cn/reference/androidx/lifecycle/Transformations
- Transformations.map()
对存储在 LiveData 对象中的值应用函数,并将结果传播到下游。
public class BookChargeVM extends AndroidViewModel {
MutableLiveData<User> userLiveData = new MutableLiveData<>();
public void setUserLiveData(User user) {
userLiveData.setValue(user);
}
LiveData<String> userName = Transformations.map(userLiveData, new Function<User, String>() {
@Override
public String apply(User user) {
return user.getName() + " " + user.getLastName();
}
});
public LiveData<String> getUserName() {
return userName;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_android_view_model);
AppLogUtils.i(TAG, "onCreate --------------");
//...
mVM.getUserName().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
AppLogUtils.i(TAG, "getUserName ====" + s);
}
});
rxViewGcUtil.add(RxView.clicks(findViewById(R.id.btn_test))
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(unit -> {
User user = new User();
user.setName("小明");
user.setLastName("小绿");
mVM.setUserLiveData(user);
}));
}
点击按钮后输出 getUserName ====小明 小绿
- Transformations.switchMap()
合并
MediatorLiveData:https://developer.android.google.cn/reference/androidx/lifecycle/MediatorLiveData
public class BookChargeVM extends AndroidViewModel {
public BookChargeVM(@NonNull Application application) {
super(application);
mediatorLiveData.addSource(liveDataName, new Observer<String>() {
@Override
public void onChanged(String s) {
Vehicle vehicle = mediatorLiveData.getValue();
if (vehicle == null) vehicle = new Vehicle();
vehicle.setName(s);
mediatorLiveData.setValue(vehicle);
}
});
mediatorLiveData.addSource(liveDataModel, new Observer<String>() {
@Override
public void onChanged(String s) {
Vehicle vehicle = mediatorLiveData.getValue();
if (vehicle == null) vehicle = new Vehicle();
vehicle.setModel(s);
mediatorLiveData.setValue(vehicle);
}
});
}
MediatorLiveData<Vehicle> mediatorLiveData = new MediatorLiveData<>();
public MediatorLiveData<Vehicle> getMediatorLiveData() {
return mediatorLiveData;
}
MutableLiveData<String> liveDataName = new MutableLiveData<>();
MutableLiveData<String> liveDataModel = new MutableLiveData<>();
public void setLiveDataName(String name) {
liveDataName.setValue(name);
}
public void setLiveDataModel(String model) {
liveDataModel.setValue(model);
}
}
调用
mVM.getMediatorLiveData().observe(this, new Observer<Vehicle>() {
@Override
public void onChanged(Vehicle vehicle) {
AppLogUtils.i(TAG, "getMediatorLiveData ====" + vehicle);
}
});
rxViewGcUtil.add(RxView.clicks(findViewById(R.id.btn_test_2))
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(unit -> {
mVM.setLiveDataName("比亚迪-糖");
}));
rxViewGcUtil.add(RxView.clicks(findViewById(R.id.btn_test_3))
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(unit -> {
mVM.setLiveDataName("IX800");
}));
输出
getMediatorLiveData ====Vehicle(name=比亚迪-糖, model=null)
getMediatorLiveData ====Vehicle(name=比亚迪-糖, model=IX800)
扩展 - 自定义LiveData
LiveData 概览 :https://developer.android.google.cn/topic/libraries/architecture/livedata
重写方法
/** * Called when the number of active observers change to 1 from 0. * <p> * This callback can be used to know that this LiveData is being used thus should be kept * up to date. */
protected void onActive() {
}
/** * Called when the number of active observers change from 1 to 0. * <p> * This does not mean that there are no observers left, there may still be observers but their * lifecycle states aren't {@link Lifecycle.State#STARTED} or {@link Lifecycle.State#RESUMED} * (like an Activity in the back stack). * <p> * You can check if there are observers via {@link #hasObservers()}. */
protected void onInactive() {
}
当 LiveData 对象具有活跃观察者时,会调用 onActive() 方法
当 LiveData 对象没有任何活跃观察者时,会调用 onInactive() 方法
参考地址
LiveData 概览 :https://developer.android.google.cn/topic/libraries/architecture/livedata
边栏推荐
- 信息学奥赛一本通T1446:素数方阵
- 【C语言】函数栈帧的创建和销毁详解
- Multi-Head-Attention principle and code implementation
- El - table column filter functions, control columns show and hide (effect and easy to implement full marks)
- 亿流量大考(1):日增上亿数据,把MySQL直接搞宕机了...
- 多线程可见
- 信息学奥赛一本通T1448:深搜的剪枝技巧 电路维修
- 关于NOI 2022的报到通知
- 阿里云-武林头条-建站小能手争霸赛
- CCF NOI 2022笔试题库
猜你喜欢
随机推荐
帆软11版本参数联动为null查询全部
qt学习之旅--MinGW32编译opencv3.0.0
Chrome configuration samesite=none method
docker-compose部署mysql
请手撸5种常见限流算法!面试必备
被数据分析重塑的5个行业
(十四)51单片机——LCD1602实现滚动效果
spark中Repartition 和 Coalesce 区别
[机缘参悟-59]:《素书》-6-安于礼仪[安礼章第六]
从学生到职场的转变
pt-online-schema-change工具使用的一次
学会可视化大屏布局技巧,让领导都赞不绝口
【playwright】pytest-playwright增加代理服务选项
RHCSA第四天
关于任命韩文弢博士代理NOI科学委员会主席的公告
Flink对比Spark
CDGA|如何加强数字政府建设?
Charles capture shows
solution 华为设备配置BFD单跳检测二层链路
解读 refresh 十二步骤