在Kotlin中有一个扩展方法observeOnce(https://code.luasoftware.com/tutorials/android/android-livedata-observe-once-only-kotlin/),这是我希望在Java中复制的行为。根据我的理解,谷歌搜索你不能在Java中使用Kotlin扩展方法(可能是错误的),所以我有两个选项使用我已经实现并且不热衷的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
}
);
每个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替换扩展函数。