LiveData的Java扩展方法

问题描述 投票:0回答:1

在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
    }
);
java android kotlin android-livedata
1个回答
2
投票

每个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替换扩展函数。

© www.soinside.com 2019 - 2024. All rights reserved.