第一个API调用返回一个元素列表,然后我希望随后调用另一个API,其中第一个API调用将在列表的每个元素中返回String
。我(认为我)已经知道了,所以它正在调用与列表中的每个元素的第二个API调用,但我不确定如何订阅以获得第二个调用返回的结果。RxJava 2,Retrofit 2 + Retrolambda - 将2个请求链接在一起
discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
// Turns the result into individual elements
.flatMapIterable(RootSearchResponse::getSearchResults)
// I believe this then calls .getRelease() with each ID string
.map(result -> discogsService.getRelease(result.getId()));
更新接口:
public interface DiscogsService
{
@GET("database/search?")
Observable<RootSearchResponse> getSearchResults(@Query("q") String searchTerm, @Query("token") String token);
@GET("releases/")
Observable<Release> getRelease(@Query("release_id") String releaseId);
}
我不确定在哪里何去何从。
我相信.subscribe(...)
然后让我能够得到从.getRelease(...)
返回Observable<Release>
。由于在模型层I中调用上述方法,则需要在该模型层中建立订户以返回Presenter
,然后Presenter
中的附加订户处理每个Observable
,因为Presenter
可以访问View
。
有没有办法让我可以从模型层返回每个Observable,所以我不需要有两个单独的.subscribe(...)
s?或者我应该使用两个单独的.subscribe(...)
s,然后在它们两个上发现错误?我只想要第二个电话的结果。
这里是我已经试过全码:
在型号:
discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.flatMapIterable(RootSearchResponse::getSearchResults)
.subscribeOn(Schedulers.io())
.map(result -> discogsService.getRelease(result.getId()))
.subscribe(new Observer<Observable<Release>>()
{
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(Observable<Release> value)
{
mainPresenter.addToRecyclerView(value);
}
@Override
public void onError(Throwable e)
{
}
@Override
public void onComplete()
{
}
});
在主讲人:
@Override
public void addToRecyclerView(Observable<Release> value)
{
value .observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<Release>()
{
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(Release value)
{
Log.e(TAG, "Success! " + value);
results.add(value);
}
@Override
public void onError(Throwable e)
{
Log.e(TAG, "Error: " + e.toString());
Log.e(TAG, "Error: " + e.toString());
}
@Override
public void onComplete()
{
}
});
我已阅读您的问题5次,并且无法理解。你能改述一下吗? – Divers
请说明你如何使用'subscribe',因为这是你需要做的。举一个例子描述“不良结果”,你至少需要订阅 –
这两个web服务调用并获得他们两个的结果,然后对结果做些什么? – MBH