android - 从 viewmodel 回调到没有数据的 ui
问题描述
如何让我的视图模型在我的活动或片段中调用一个函数而不使用回调并且实际上没有发送数据。LiveData 用于将数据从视图模型发送到视图,但我没有数据。我只是想通知 ui 一些事情。是否应该使用 RxJava 来完成,还是太过分了?
解决方案
LiveData 很好,这是我最近所做的(源自https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150)
首先创建一个类
public class OneTimeEvent {
private Boolean received;
public OneTimeEvent() {
received = false;
}
public Boolean receive () {
if (!received) {
received = true;
return true;
}
return false;
}
}
然后在您的 ViewModel 中公开您的事件
private MediatorLiveData<OneTimeEvent> eventListener = new MediatorLiveData<>();
public LiveData<OneTimeEvent> onEvent() {
return eventListener;
}
现在您必须在 ViewModel 中的某处触发事件(就像其他事情已经完成一样)
eventListener.setValue(new OneTimeEvent()); //if its a background thread or callback use postValue!
就是这样,现在您可以在任何您喜欢的活动或片段中观察 onEvent()
ViewModel.onEvent().observe(this, new Observer<OneTimeEvent>() {
@Override
public void onChanged(OneTimeEvent oneTimeEvent) {
if (oneTimeEvent.receive()){
// do something on event
}
}
});
希望这会有所帮助,它就像一个事件监听器,只是你可以同时从多个位置监听,并且每个事件只会被触发一次,例如,如果观察者被重新连接到其他地方。
推荐阅读
- swiftcharts - “SwiftChart”pod 库在 Chart.swift 文件中有错误
- java - 如何使用他们在 Firebase 实时数据库中保存的 ID 从另一个表中获取数据
- javascript - 如何定位数组中的对象子集并将属性更改为每个对象的递增数字?
- javascript - 在 Fetch JS for Django 中添加 CSRF
- c# - 具有数据绑定和额外价值的组合框
- javascript - 在 HTML 中渲染箭头
- embedded - malloc 如何知道嵌入式系统中第一个可用块在哪里?
- jdbc - 使用 JDBC 建立连接
- arrays - 将一个数组中的重复对象推送到它们自己的数组中
- python-3.x - 获取空内容 Beautiful Soup Python