Обратный вызов из viewmodel в пользовательский интерфейс без данных - PullRequest
1 голос
/ 20 мая 2019

Как я могу заставить мою viewmodel вызывать функцию в моей деятельности или фрагменте без использования обратного вызова и куда данные фактически не отправляются.LiveData используется для отправки данных из модели представления в представление, но у меня нет данных.Я просто хочу уведомить пользовательский интерфейс о чем-то.Должно ли это быть сделано с использованием RxJava или это перебор?

1 Ответ

0 голосов
/ 20 мая 2019

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

Надеюсь, это поможет, он действует так же, как EventListener, только в том, что вы можете одновременно прослушивать из нескольких местоположений, и каждое событие будет запущено только один раз, например, если наблюдатель повторно подключен где-то еще.

...