RxJava中MutableLiveData的等效实现及setValue对应方法咨询
嘿,我来帮你梳理这两个问题的答案,都是RxJava和Android LiveData常用的对应场景~
关于RxJava与MutableLiveData的对应组件及等效实现问题
1. RxJava中对应MutableLiveData的组件
RxJava里没有和MutableLiveData完全一一对应的原生类,但BehaviorSubject是最贴合它核心特性的组件:
- 它会持有当前的最新值,新订阅的观察者会立即收到这个当前值(就像MutableLiveData订阅时会获取当前的value);
- 每当有新值发射时,所有活跃的观察者都会收到通知,和MutableLiveData的
setValue()/postValue()效果一致。
如果你的场景不需要初始值,PublishSubject更接近普通LiveData,但MutableLiveData的核心是「持有状态+订阅即得当前值」,所以BehaviorSubject是首选。
2. RxJava 2对NameViewModel的等效实现
先还原下官方NameViewModel的核心逻辑(就是你提到的那个片段):
public class NameViewModel extends ViewModel {
// 创建一个String类型的LiveData
private MutableLiveDatamCurrentName; public MutableLiveData<String> getCurrentName() { if (mCurrentName == null) { mCurrentName = new MutableLiveData<>(); } return mCurrentName; } // 供外部调用更新值 public void setCurrentName(String name) { mCurrentName.setValue(name); }}
RxJava 2的等效实现(用BehaviorSubject)
public class NameViewModel extends ViewModel { private BehaviorSubject<String> mCurrentName; public Observable<String> getCurrentName() { if (mCurrentName == null) { // 可以传入初始值,比如空字符串,对应MutableLiveData的初始null或自定义默认值 mCurrentName = BehaviorSubject.createDefault(""); } // 返回hide()后的Observable,避免外部直接调用onNext,保证封装性 return mCurrentName.hide(); } // 对应MutableLiveData的setValue()方法 public void setCurrentName(String name) { mCurrentName.onNext(name); } @Override protected void onCleared() { super.onCleared(); // ViewModel销毁时结束Subject,防止内存泄漏 mCurrentName.onComplete(); } }
用publish()/refcount()/replay()组合实现的方式
如果要用你提到的publish()、refcount()、replay()组合来模拟MutableLiveData的行为,本质是创建一个能缓存最后1个值的可连接Observable,效果和BehaviorSubject几乎一致:
public class NameViewModel extends ViewModel { private PublishSubject<String> mNameEmitter; private Observable<String> mCurrentName; public Observable<String> getCurrentName() { if (mCurrentName == null) { mNameEmitter = PublishSubject.create(); // replay(1)保存最后1个值,refCount()自动管理连接(有订阅时激活,无订阅时释放) mCurrentName = mNameEmitter.replay(1).refCount(); } return mCurrentName; } // 对应MutableLiveData的setValue(),通过发射事件更新状态 public void setCurrentName(String name) { mNameEmitter.onNext(name); } @Override protected void onCleared() { super.onCleared(); mNameEmitter.onComplete(); } }
这里的mNameEmitter.onNext(name)就完全对应MutableLiveData的setValue()——它会发射新的状态值,所有订阅了mCurrentName的观察者都会收到通知,同时replay(1)会缓存这个最新值,让后续新订阅的观察者也能立即获取到当前状态。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

