2017-08-14 55 views
0

我为什么下面的代码不工作有点糊涂了:的Android MediatorLiveData观察者

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!"); 
+0

没有什么是观察'mediatorTest'。没有活跃的观察员时,会跳过很多东西。 – CommonsWare

+0

@CommonsWare在这个例子中,观察者不是'mutableTest' observable和'mediatorTest'吗?为什么我需要观察'mediatorTest'?我找不到一个简化的演示,它给了我期望的结果。我认为'addSource'应该是将侦听器添加到'mediatorTest'观察器,其中'mutableTest'在第一个参数中作为可观察值传递,而lambda在第二个参数中作为回调传递。 – Trace

+0

'mediatorTest'既是观察者又是观察者。毕竟这是一个'LiveData',这意味着它是可观察的。 “为什么我需要观察mediatorTest?” - 必须消耗数据。这是一个观察员。你有两个'LiveData'对象,但只有一个被观察到。 “MediatorLiveData”的主要用途AFAIK用于转换,并且在那里,转换方法(例如'map()')返回'MediatorLiveData',然后观察它以查看转换的结果。 – CommonsWare

回答

4

这个答案很大程度上是@CommonsWare已经在上面评论部分分享的。

为了MediatorLiveData的addSource方法的回调被触发,MediatorLiveData对象也需要被观察。

这背后的逻辑是'介体'介于它观察的LiveData对象和数据的最终用户之间。因此调解员是观察员并可同时观察,并且在没有活跃的观察员时调解员不会触发addSource的回调。

作为一个例子;根据Google的Android体系结构组件,一个活动或片段可以让观察者观察ViewModel上的中介,后者又可以观察在ViewModel中处理的其他LiveData对象或引用的实用程序类。

@CommonsWare指出了Transformation类的使用,该类揭示了方法mapswitchMap,但这些不在我的用例范围之内,尽管他们值得检查。