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

标签 android android-livedata android-architecture-lifecycle android-architecture

我最近在我的 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/

相关文章:

android - AlarmManager 多次启动

android - LocalBroadcastManager 已被弃用。我应该用什么代替它?

android-recyclerview - 使用 LiveData、Room 和 DiffUtil 更新 RecyclerView 项目内的内部 View

android - 当应用程序处于后台时,我的 mvvm、livedata 应用程序是否应该取消网络请求?

android - 如何为 ViewPager 中的每个页面创建 ViewModel?

java - 我可以使用 Jar 签名来保护 Android APK 文件免遭反编译吗?

java - 切换fragment时如何维护fragment状态

android - Kotlin:带实时数据的协程还是只有协程?

android - 在不同 Activity 中的 Fragment 之间共享 ViewModel

java - 使用 JSON 将对象放入 recyclerview