首页 > 解决方案 > 从 viewmodel 回调到没有数据的 ui

问题描述

如何让我的视图模型在我的活动或片段中调用一个函数而不使用回调并且实际上没有发送数据。LiveData 用于将数据从视图模型发送到视图,但我没有数据。我只是想通知 ui 一些事情。是否应该使用 RxJava 来完成,还是太过分了?

标签: androidkotlinrx-java

解决方案


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
            }
        }
    });

希望这会有所帮助,它就像一个事件监听器,只是你可以同时从多个位置监听,并且每个事件只会被触发一次,例如,如果观察者被重新连接到其他地方。


推荐阅读