レトロフィットの RxJava サポートを使用してオブザーバブルを連鎖させることに問題があります。私はおそらくそれを使用する方法を誤解しています, そうでなければ、それは改造のバグかもしれません. ここの誰かが何が起こっているのかを理解するのを手伝ってくれることを願っています。編集:私はこれらの応答に MockRestAdapter を使用しています - RxSupport の実装がわずかに異なるため、これは関連している可能性があります。
これは偽の銀行アプリです。送金を行おうとしています。送金が完了したら、アカウントの値を更新するためにアカウント リクエストを実行する必要があります。これは基本的に、flatMap を試してみる言い訳にすぎません。残念ながら、次のコードは機能しません。サブスクライバーに通知されることはありません。
ケース 1: 改造によって生成された 2 つのオブザーバブルを連鎖させる
転送サービス (注: レトロフィットで生成されたオブザーバブルを返します):
@FormUrlEncoded @POST("/user/transactions/")
public Observable<TransferResponse> transfer(@Field("session_id") String sessionId,
@Field("from_account_number") String fromAccountNumber,
@Field("to_account_number") String toAccountNumber,
@Field("amount") String amount);
アカウント サービス (注: レトロフィットで生成されたオブザーバブルを返します):
@FormUrlEncoded @POST("/user/accounts")
public Observable<List<Account>> getAccounts(@Field("session_id") String sessionId);
改造によって生成された 2 つのオブザーバブルを連結します。
transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount)
.flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() {
@Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) {
return accountsService.getAccounts(session.getSessionId());
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
ケース 2: 独自のオブザーバブルを作成し、レトロフィットで生成されたものとチェーンする
「フラット マップ」呼び出しに対する Retrofit の組み込み Rx サポートを無視すると、完全に機能します。すべてのサブスクライバーに通知が届きます。下記参照:
新しいアカウント サービス (注: オブザーバブルは生成されません):
@FormUrlEncoded @POST("/user/accounts")
public List<Account> getAccountsBlocking(@Field("session_id") String sessionId);
独自のオブザーバブルを作成し、アイテムを自分で発行します。
transfersService.transfer(session.getSessionId(), fromAccountNumber, toAccountNumber, amount)
.flatMap(new Func1<TransferResponse, Observable<? extends List<Account>>>() {
@Override public Observable<? extends List<Account>> call(TransferResponse transferResponse) {
return Observable.create(new Observable.OnSubscribe<List<Account>>() {
@Override public void call(Subscriber<? super List<Account>> subscriber) {
List<Account> accounts = accountsService.getAccountsBlocking(session.getSessionId());
subscriber.onNext(accounts);
subscriber.onCompleted();
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
どんな助けでも大歓迎です!