事件包装器模式是否可以代替SingleLiveEvent的使用?

时间:2018-10-13 02:25:10

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

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

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

我想确定SingleLiveEventevent wrapper pattern,这是在Android MVVM体系结构中与LiveData一起使用的最佳实践。而且我发现今年(2018年)的Google I/O app没有使用 SingleLiveEvent ,而是使用事件包装模式

以前,我已经在项目issue上打开了android-architecture,起初我正在寻求正式答复,但似乎一点也没有评论。因此,我想听听已经使用这些东西并对此有所反思的开发人员的建议。

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

2 个答案:

答案 0 :(得分:2)

我不喜欢SingleLiveEvent,因为它只限于一个观察者,但是您也可以添加许多观察者,因此容易出错。

但是在非常简单的情况下(例如您提到的todo应用),它可能比事件包装器模式更好。

在复杂的情况下,事件包装器模式是一个更好的选择,但它也有一些限制。 This implementation假设您只有一个主要消费者(请参阅getContentIfNotHandled)。因此,我认为与多个观察者打交道将使样板决定哪个是主要使用者,或者何时给getContentIfNotHandledpeekContent打电话。

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

例如,以下是SingleLiveEvent中的extended version,它支持多个观察者:

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世界中现有的模式)来处理状态。

请记住,软件工程没有灵丹妙药。

答案 1 :(得分:0)

SingleLiveData仅限于一个观察者,this文章中描述的EventLiveData支持多个观察者。

您可以像常规实时数据一样使用它。不会骇客,也不会给代码增加不必要的复杂性。

implementation 'com.rugovit.eventlivedata:eventlivedata:1.0'

MutableEventLiveData<String>  eventLiveData =new MutableEventLiveData<>(); 
viewModel.event.observe(this, Observer {
    // ...
})
 

它是livedata的扩展,并支持livedata的所有功能。 与其他解决方案不同,此支持多个观察者

Github链接:https://github.com/rugovit/EventLiveData