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 指出了公开方法 map
和 switchMap
的转换 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(...)
也存在同样的问题,其中返回的 LiveData
的 getValue()
不一定 returns 是最新值,除非它被观察到。
我对为什么以下代码不起作用感到有点困惑:
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 指出了公开方法 map
和 switchMap
的转换 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(...)
也存在同样的问题,其中返回的 LiveData
的 getValue()
不一定 returns 是最新值,除非它被观察到。