【问题标题】:Setting LiveData value from RxJava observable (Android)从 RxJava observable (Android) 设置 LiveData 值
【发布时间】:2021-10-11 22:07:59
【问题描述】:

我的存储库类中有一个LiveData,它在活动(我正在使用 MVVM 架构)中被观察(当然是通过视图模型),当单击按钮时,使用返回 RxJava2 的 Retrofit 调用 API Observable(不是 Call)因为我需要 RxJava2 将 2 个 api 调用压缩在一起。然后应将来自 API 的请求数据设置为 LiveData 的新值。这是从 Retrofit API 调用创建的 Observable

Observable.zip(retrofitService.getData(), retrofitService.getData2(),
                    new BiFunction<List<float[]>, List<float[]>, List<Object>>() {
                        @NonNull
                        @Override
                        public List<Object> apply(@NonNull List<float[]> floats, @NonNull List<float[]> floats2) throws Exception {
                             // combine the two different api calls 
                            List<Object> newlist = ...
                            return newList;
                        }
                    });

当然,如果在我的应用程序中单击另一个按钮,则会调用另一个 API。 现在我的问题是,如何从 Observable 更新 LiveData 的值(例如上面给出的值)。我知道LiveDataReactiveStreams.fromPublisher() 方法,但我不确定如何在这里应用它。那么唯一的方法是订阅 observable 然后在 livedata 上调用 postvalue 吗?

Observable.zip(retrofitService.getData(), retrofitService.getData2(),
                    new BiFunction<List<float[]>, List<float[]>, List<Object>>() {
                        @NonNull
                        @Override
                        public List<Object> apply(@NonNull List<float[]> floats, @NonNull List<float[]> floats2) throws Exception {
                             // combine the two different api calls 
                            List<Object> newlist = ...
                            return newList;
                        }
                    }).subscribe(list -> repository.updateLiveData(list));

对于含糊的解释,我深表歉意,我很难表达这个问题。

【问题讨论】:

    标签: java android mvvm rx-java android-livedata


    【解决方案1】:

    你可以这样做。

    注意 .toFlowable()。

        LiveData<?> liveData = LiveDataReactiveStreams.fromPublisher(Observable.zip(retrofitService.getData(), retrofitService.getData2(),
                new BiFunction<List<float[]>, List<float[]>, List<Object>>() {
                    @NonNull
                    @Override
                    public List<Object> apply(@NonNull List<float[]> floats, @NonNull List<float[]> floats2) throws Exception {
                        // combine the two different api calls 
                        List<Object> newlist = ...
                        return newList;
                    }
                }).toFlowable().subscribe(list -> repository.updateLiveData(list)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多