Ho problemi con il concatenamento di osservabili utilizzando il supporto RxJava di retrofit. Probabilmente fraintendo come usarlo, altrimenti potrebbe esserci un bug in retrofit. Spero che qualcuno qui possa aiutarmi a capire cosa sta succedendo. Modifica: Sto utilizzando il MockRestAdapter per queste risposte - questo potrebbe essere rilevante in quanto vedo che le implementazioni di RxSupport differiscono leggermente.Concatenazione di servizi di retrofit con supporto RxJava
Questa è un'app bancaria falsa. Sta provando a fare un trasferimento e, una volta completato il trasferimento, dovrebbe fare una richiesta di account per aggiornare i valori dell'account. Questo è fondamentalmente solo una scusa per me per provare flatMap. Il codice seguente, purtroppo, non funziona, non abbonati mai ricevere la notifica:
Caso 1: concatenamento di due osservabili retrofit-prodotta
Il servizio di trasferimento (nota: restituisce un retrofit-prodotta osservabile):
@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);
Il servizio di conto (nota: restituisce un retrofit-prodotta osservabile):
@FormUrlEncoded @POST("/user/accounts")
public Observable<List<Account>> getAccounts(@Field("session_id") String sessionId);
Catene due osservabili retrofit-prodotta insieme:
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());
Caso 2: creare il mio osservabili e concatenamento con un retrofit-prodotto uno
se ignoro il supporto integrato Rx nel retrofit per la " chiamata piatta mappata, funziona perfettamente! Tutti gli abbonati ricevono una notifica. Vedi sotto:
Il nuovo servizio di conti (nota: non produce un osservabile):
@FormUrlEncoded @POST("/user/accounts")
public List<Account> getAccountsBlocking(@Field("session_id") String sessionId);
creare la mia osservabile ed emettono le voci me:
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());
Qualsiasi aiuto sarebbe molto apprezzato!
Quale versione di retrofit e rxjava stai usando? –