我用改型/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());
}
})));
我用的是好方法吗?或者需要改变什么?
这是我解决问题的解决方案:
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();
}
}));
}
如果没有存储库的签名,很难说到底出了什么问题,但是您确实提到了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