第一個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