Android MediatorLiveData 观察者

Android MediatorLiveData observer

我对为什么以下代码不起作用感到有点困惑:

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

这个答案主要是对@CommonsWare 在上面的评论部分中已经分享的内容的复制。

为了触发 MediatorLiveData 的 addSource 方法的回调,还需要观察 MediatorLiveData 对象本身。

这背后的逻辑是 'mediator' 在它观察的 LiveData 对象和数据的最终消费者之间进行调解。中介因此是一个观察者并且同时是可观察的,当没有活跃的观察者时,不会为中介触发 addSource 上的回调。

举个例子;根据 Google 的 Android 架构组件,activity 或片段可以让观察者观察 ViewModel 上的中介者,而后者又可以观察在 ViewModel 中处理的其他 LiveData 对象或对实用程序的引用 class。

@CommonsWare 指出了公开方法 mapswitchMap 的转换 class 的使用,但这些不在我的用例范围内,尽管它们值得一试.

我来到这里是因为我有或多或少相同的经历,但是 MediatorLiveData.getValue()。直到我面对它时,我才意识到这是一个问题。我的问题可以这样表述:

MutableLiveData<String> mutableTest = new MutableLiveData<>();
MediatorLiveData<String> mediatorTest = new MediatorLiveData<>();
mediatorTest.addSource(mutableTest, test -> {
    mediatorTest.value = test;
});
mutableTest.setValue("bla!");
mediatorTest.getValue(); // will be null

我知道它有点简化,但是 MediatorLiveData.getValue() 不会包含 "bla" 这样你永远不知道你是否可以信任 getValue() 除非你是 100%确定它是活动的(有多个观察者服务器)。

Transformations.map(...)TransformationsswitchMap(...) 也存在同样的问题,其中返回的 LiveDatagetValue() 不一定 returns 是最新值,除非它被观察到。