Методы расширения Java для LiveData - PullRequest
1 голос
/ 12 марта 2019

В Kotlin есть метод расширения наблюдаем (https://code.luasoftware.com/tutorials/android/android-livedata-observe-once-only-kotlin/)), который я собираюсь повторить в Java. Насколько я понимаю, поиск в Google не позволяет использовать методы расширения Kotlin в Java (может быть неправильно), поэтому у меня есть два варианта использования SingleEventLiveData, которые я реализовал и которые мне не интересны, и удаление моего наблюдателя после его использования;

final LiveData<List<String>> stringsLiveData = mViewModel.getStrings();

stringsliveData.observe(getViewLifecycleOwner(), strings -> {
    // Do stuff with data here
    stringsLiveData.removeObservers(getViewLifecycleOwner());
});

Есть ли эквивалентный метод, который можно использовать как ссылку выше, так что

mViewModel.getStrings().observeOnce(getViewLifecycleOwner(), strings -> {
    //Do stuff here
});

Редактировать : Согласно принятому ответу ниже (изменен для компиляции), я получил;

class LiveDataUtils {
    public static <T> void observeOnce(LiveData<T> liveData, Observer<T> observer) {
        liveData.observeForever(o -> {
            liveData.removeObserver(observer);
            observer.onChanged(o);
        });
    }
}

и простое использование этого;

LiveDataUtils.observeOnce(
    mViewModel.getStrings(),
    strings -> {
        // Do some work here
    }
);

1 Ответ

2 голосов
/ 12 марта 2019

Каждая функция расширения Kotlin разрешена статически, что означает, что вы можете сделать то же самое в Java, используя статические функции.Он не так удобен для чтения или интуитивно понятен, как функции расширения, но выполняет ту же работу.

Создайте класс util с помощью статического метода:

public class LiveDataUtils {

   public static <T> observeOnce (LifecycleOwner owner, LiveData<T> liveData, Observer<T> observer) {
         liveData.observeForever(o -> {
               observer.onChanged(o);
               removeObserver(owner);
     } 
}

Я не тестировалкод, поэтому он может иметь некоторые ошибки.Цель состояла в том, чтобы показать вам, как вы можете заменить функции расширения в Java.

...