Посмотрите ниже пример того, как вы можете создать один LiveEvent , чтобы наблюдать только один раз как LiveData
:
Создать класс с именем Event
какниже это предоставит наши данные один раз и будет действовать как потомок LiveData
оболочки:
public class Event<T> {
private boolean hasBeenHandled = false;
private T content;
public Event(T content) {
this.content = content;
}
public T getContentIfNotHandled() {
if (hasBeenHandled) {
return null;
} else {
hasBeenHandled = true;
return content;
}
}
public boolean isHandled() {
return hasBeenHandled;
}
}
Затем объявите этот класс EventObserver
, как показано ниже, чтобы мы не закончили условие размещения для проверки около Event
обрабатывается каждый раз, везде:
public class EventObserver<T> implements Observer<Event<T>> {
private OnEventChanged onEventChanged;
public EventObserver(OnEventChanged onEventChanged) {
this.onEventChanged = onEventChanged;
}
@Override
public void onChanged(@Nullable Event<T> tEvent) {
if (tEvent != null && tEvent.getContentIfNotHandled() != null && onEventChanged != null)
onEventChanged.onUnhandledContent(tEvent.getContentIfNotHandled());
}
interface OnEventChanged<T> {
void onUnhandledContent(T data);
}
}
И как вы можете это реализовать:
MutableLiveData<Event<String>> data = new MutableLiveData<>();
// And observe like below
data.observe(lifecycleOwner, new EventObserver<String>(data -> {
// your unhandled data would be here for one time.
}));
// And this is how you add data as event to LiveData
data.setValue(new Event(""));
См. здесь для подробностей.
Редактировать для OP :
Да, data.setValue(new Event(""));
предназначено для хранилища, когда вы получили ответ от API (не забудьте вернуть тот же LiveData
тип, который вы использовали в ВМ вместо SingleLiveEvent
класса) .
Итак, допустим, вы создали LiveData
в ViewModel
, как показано ниже:
private MutableLiveData<Event<String>> snackbarStringSingleLiveEvent= new MutableLiveData<>();
Вы указываете значение этого вивата в виде Одиночное событие из репозитория, как показано ниже:
@Override
public void onResponse(Call<GenericResponse> call, Response<GenericResponse> response) {
mutableLiveData.setValue(new Event(response.body().getMessage())); // we set it as Event wrapper class.
}
И соблюдайте егоn UI (фрагмент) как показано ниже:
viewModel.getSnackbarStringSingleLiveEvent().observe(this, new EventObserver<String>(data -> {
// your unhandled data would be here for one time.
}));