当前位置: 首页 > 知识库问答 >
问题:

响应中每个项目的RxJava/改装调用

傅穆冉
2023-03-14

我用改型/rxJava调用我的API,得到了一个可观察的响应,就像一个BreedDog列表

...你可以看到我的代码

compositeDisposable.add(breedDogsDisplayDataRepository.getBreedDogs(name)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<List<BreedDog>>() {

                @Override
                public void onSuccess(List<BreedDog> breedDogList) {
                    Log.e("test", "okPresenter");
                    view.displayBreedDogs(breedDogToViewModelMapper.map(breedDogList));
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("test", "errorPresenter : " + e.toString());
                    // handle the error case
                    System.out.println(e.toString());
                }
            }));

这是可行的,但是现在,对于列表中的每一项,我都需要调用API来获取URL图像并更新列表。。但我不知道怎么。。。我试着在Observable中更改我的单个响应,并使用了flatMap或flatMapIterate之类的运算符。。等等,但每次我都会在对象上出错。。没有一个例子。。。等

这是一个例子:

breedDogsDisplayDataRepository.getBreedDogs(name)
            .flatMapIterable(breedDogs -> breedDogs)
            .map( item ->   breedDogsDisplayDataRepository.getImageBreedDog(item.getId())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeWith(new DisposableSingleObserver<List<BreedImageResponse>>() {

                        @Override
                        public void onSuccess(List<BreedImageResponse> breedImageResponses) {

                        }

                        @Override
                        public void onError(Throwable e) {
                            Log.e("test", "errorPresenter : " + e.toString());
                            // handle the error case
                            System.out.println(e.toString());
                        }
                    })));

我用的是好方法吗?或者需要改变什么?

共有2个答案

龚振濂
2023-03-14

这是我解决问题的解决方案:

public Single<List<BreedDogWithImage>> searchDogs(String name) {
    return getBreedDogs(name)
            .flatMapIterable(breedDogs -> breedDogs)
            .flatMap(breedDog -> getImageBreedDogs(breedDog.getId())
                    .flatMapIterable(breedDogWithImages -> breedDogWithImages))
            .toList();
}

所以我可以这样称呼它:

public void searchBreedDogs(String name) {
    compositeDisposable.clear();
    compositeDisposable.add(breedDogsDisplayDataRepository.searchDogs(name)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<List<BreedDogWithImage>>() {

                @Override
                public void onSuccess(List<BreedDogWithImage> breedDogWithImages) {
                    Log.e("test", "okCall" + breedDogWithImages);
                    view.displayBreedDogs(breedDogToViewModelMapper.map(breedDogWithImages));
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("test", "error ");
                    e.printStackTrace();
                }
            }));
}
袁英豪
2023-03-14

如果没有存储库的签名,很难说到底出了什么问题,但是您确实提到了getBreedDogs返回一个单字符

它将映射单中的列表,并将其项作为可观察项发出。这意味着您不能再使用map,必须切换到flatMap

.flattenAsObservable(breedDogs -> breedDogs) 
.flatMapSingle(item -> breedDogsDisplayDataRepository.getImageBreedDog(item.getId()))

使用的是平面映射,因为在这种情况下,我们是平面映射Singles

我注意到的另一件事是,您的“订阅部分”位于映射中,您希望从中删除它。因此,理想情况下,你会搬到外面,比如:

.flattenAsObservable(breedDogs -> breedDogs) 
.flatMapSingle(item -> breedDogsDisplayDataRepository.getImageBreedDog(item.getId()))
.subscribeWith(/*...*/);

调度程序由你决定。如果您希望您的图像被并行下载,我建议将它们保存在flatMapSing中。

最后一件事,您似乎希望收到一个列表

breedDogsDisplayDataRepository.getBreedDogs(name)
  .flattenAsObservable(breedDogs -> breedDogs) 
  .flatMapSingle(item ->
    breedDogsDisplayDataRepository.getImageBreedDog(item.getId())
      .subscribeOn(Schedulers.io())
  )
  .toList()
  .observeOn(AndroidSchedulers.mainThread())
  .subscribeWith(new DisposableSingleObserver<List<BreedImageResponse>>() {
        @Override
        public void onSuccess(List<BreedImageResponse> breedImageResponses) { 
        }

        @Override
        public void onError(Throwable e) {}
  });

 类似资料:
  • 我正在使用Rxjava进行改装,以获得API的响应,因为您可以看到我使用的方法,我看不到响应中会出现什么,当然我不需要,因为我提供了GsonConverter进行改装,但出于某些调试原因,我需要看到来自API的响应。我怎样才能做到这一点,我需要添加什么代码。

  • 我有一个方法返回一个

  • 我试图通过将多个改型api调用链接在一起来创建一个可观察的api。这些步骤是: 使用api调用获取json对象列表 对于列表中的每个对象,进行另一个api调用以获取有关该项目的更多详细信息 将从这个新的详细对象中获取的数据写入磁盘上的文件(列表中的每个项目都会出现这种情况) 最后返回一个单独对象的可观察性,该对象要求为之前的每个对象创建一个文件 这是我到目前为止所拥有的: 请有人确认我使用了正确的

  • 问题内容: 我正在努力实现我认为在Rx中相当简单的东西。 我有一个项目列表,我想延迟每个项目的发出。 似乎Rx delay()运算符只是将所有项目的发射偏移指定的延迟,而不是每个单独的项目。 这是一些测试代码。它将列表中的项目分组。然后,每个组应在发出之前应用延迟。 结果是: 但是我希望看到的是这样的: 我究竟做错了什么? 问题答案: 一种方法是将可观察值与可观察值结合起来以延迟输出。

  • 我使用改型2,我正在学习RxJava。我从某处下载了一个项目列表。我想对每个项目进行api调用,并创建扩展项目的新列表。两个调用都返回一个可观察的。它看起来像这样: 详细服务: } 问题是get细节返回一个可观察的,我不能用它来构造扩展项。在rxJava链中,更改get细节调用以返回对象不起作用,我猜是因为它将结果返回给主线程。如何获取对象本身?我尝试了很多其他的方法,但到目前为止都没有成功。

  • 问题内容: 我刚刚开始使用Java中的列表。我想知道推荐的修改列表中每个元素的方法是什么? 我已经可以通过以下两种方法来完成此任务,但是它们看起来都相当简单。有没有更好的方法可以在Java中完成此操作?是否推荐以下任何一种方法,或者两者都处于同一水平? 问题答案: 第二个版本会更好。在内部,它们最后是相同的,但是第二个实际上允许您修改列表,而第一个将引发ConcurrentModification