我不喜欢它,SingleLiveEvent
因为它仅限于一个观察者,但你也可以添加许多观察者,所以它很容易出错。
但在一个非常简单的场景中(比如你提到的 todo 应用程序),它可能是比事件包装器模式更好的选择。
在复杂的场景中,事件包装器模式会是更好的选择,但它也有一些限制。此实现假设您只有一个主要消费者(请参阅参考资料getContentIfNotHandled
)。因此,我认为与多个观察者打交道将导致样板文件决定哪个是主要消费者,或者我应该何时调用getContentIfNotHandled
or peekContent
。
但是,所有这些限制都可以通过您自己的实现来解决。
例如,这是一个支持多个观察者的扩展版本SingleLiveEvent
:
public class SingleLiveEvent<T> extends MutableLiveData<T> {
private LiveData<T> liveDataToObserve;
private final AtomicBoolean mPending = new AtomicBoolean(false);
public SingleLiveEvent() {
final MediatorLiveData<T> outputLiveData = new MediatorLiveData<>();
outputLiveData.addSource(this, currentValue -> {
outputLiveData.setValue(currentValue);
mPending.set(false);
});
liveDataToObserve = outputLiveData;
}
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
liveDataToObserve.observe(owner, t -> {
if(mPending.get()) {
observer.onChanged(t);
}
});
}
@MainThread
public void setValue(T value) {
mPending.set(true);
super.setValue(value);
}
}
如您所见,这SingleLiveEvent
与 vs 事件包装器模式无关,这完全取决于。就个人而言,我使用其他模式(如 React/Flux 世界中存在的模式)来处理状态。
请记住,软件工程中没有灵丹妙药。