gpt4 book ai didi

android - 事件包装器模式是否取代了 SingleLiveEvent 的使用?

转载 作者:行者123 更新时间:2023-11-29 18:42:32 25 4
gpt4 key购买 nike

我最近在我的 Android 应用中采用了 MVVM。为了解决应用程序生命周期的潜在问题,谷歌发布了LiveData。

正如 medium article wrote by Jose Alcérreca 中所指出的,LiveData 的使用有不同的场景。 ,您可以使用 SingleLiveEvent 或类似事件包装器模式的东西。

我想确定 SingleLiveEvent ,或 event wrapper pattern ,哪一个是在 Android MVVM 架构中与 LiveData 一起使用的最佳实践。我找到了 Google I/O app今年(2018 年)没有使用SingleLiveEvent,而是使用事件包装器模式

之前我打开了一个issue在项目上android-architecture ,一开始是求官方回复的,但是貌似一点意见都没有。因此,我想听听已经使用这些东西并对此有反射(reflection)的开发人员的建议。

请分享您宝贵的经验,在此先感谢您。

最佳答案

我不是 SingleLiveEvent 的粉丝,因为它仅限于一个观察者,但您也可以添加许多观察者,因此它很容易出错。

但在非常简单的场景中(比如您提到的待办事项应用程序),它可能是比事件包装器模式更好的选择。

在复杂的场景下,事件包装器模式会是更好的选择,但它也有一些局限性。 This implementation假设您只有一个主要 消费者(参见getContentIfNotHandled)。因此,我认为与多个观察者打交道会导致样板决定哪个是主要消费者,或者我应该何时调用 getContentIfNotHandledpeekContent

但是,所有这些限制都可以通过您自己的实现来解决。

例如这里是一个extended version 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 与事件包装器模式无关,这完全取决于。就个人而言,我使用其他模式(例如 React/Flux 世界中存在的模式)来处理状态。

请记住,软件工程中没有 Elixir 。

关于android - 事件包装器模式是否取代了 SingleLiveEvent 的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52788958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com