【发布时间】:2017-08-14 17:33:10
【问题描述】:
我对为什么下面的代码不起作用有点困惑:
MutableLiveData<String> mutableTest = new MutableLiveData<>();
MediatorLiveData<String> mediatorTest = new MediatorLiveData<>();
mediatorTest.addSource(mutableTest, test -> {
Timber.d(test);
});
mutableTest.setValue("bla!");
这段代码看起来很简单,但是调试器没有进入回调,控制台也没有记录任何东西......
编辑:这不应该工作吗?
MutableLiveData<String> mutableTest = new MutableLiveData<>();
MediatorLiveData<String> mediatorTest = new MediatorLiveData<>();
mediatorTest.observe(loginActivity, str -> Timber.d(str));
mediatorTest.addSource(mutableTest, str -> Timber.d(str));
mutableTest.setValue("bla!");
【问题讨论】:
-
没有观察到
mediatorTest。当没有活跃的观察者时,很多东西都会被跳过。 -
@CommonsWare 在这个例子中,
mutableTest不是可观察者,mediatorTest不是观察者吗?为什么我需要观察mediatorTest?我找不到可以给我预期结果的简化演示。我认为addSource应该将侦听器添加到mediatorTest观察者,其中mutableTest在第一个参数中作为可观察对象传递,而lambda 在第二个参数中作为回调传递。 -
mediatorTest既是观察者又是可观察者。毕竟这是一个LiveData,这意味着它是一个可观察的。 “为什么我需要观察 mediatorTest?” -- 必须有东西消耗数据。那是观察者。您有两个LiveData对象,但只有一个被观察到。MediatorLiveDataAFAIK 的主要用途是用于转换,转换方法(例如map())返回MediatorLiveData,然后观察它以查看转换结果。 -
FWIW,请参阅 this sample app 了解自定义转换(RxJava 风格的
filter())及其应用程序。我使用MediatorLiveData观察提供的LiveData,然后下游消费者观察MediatorLiveData。另外,请参阅库中Transformations类的源代码。 -
由于我没有在转换方法之外使用
MediatorLiveData的示例,我建议您回答自己的问题,显示您最终得到的结果(特别是如果这与您的不同)编辑)。