2 ağ çağrısını birbiri ardına yürütmek istiyorum. Her iki ağ çağrısı da Gözlenebilir. İkinci çağrı, ilk aramanın başarılı sonucundan veri kullanır, ikinci aramanın başarılı sonucundaki yöntemde, numaralı telefonun verileri numaralı telefonun ilk ve ikinci çağrısının başarılı sonucudur. Ayrıca hem onError "olayları" farklı şekilde ele alabilmeliyim. Ben aşağıdaki örnekte olduğu gibi bu kaçınarak geri arama cehennem elde edebilirsiniz Nasıl:Zinciri iki retrofit gözle görülür zincirleme w/RxJava
API().auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<AuthResponse>() {
@Override
public void call(final AuthResponse authResponse) {
API().getUser(authResponse.getAccessToken())
.subscribe(new Action1<List<User>>() {
@Override
public void call(List<User> users) {
doSomething(authResponse, users);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorGetUser();
}
});
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorAuth();
}
});
Ben zip bilmem ama ben için "Birleştirici sınıfı" oluşturarak kaçınmak istiyorum. 1.
Güncelleme akarnokd cevabını uygulamaya çalıştı:
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(authResponse -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> {
getView().setError(processFail(throwable));
}), ((authResponse, users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
} else {
getView().setError(R.string.something_went_wrong);
}
}));
Ancak flatMap
içindeki yöntem derleyici o authResponse ve kullanıcılara (authResponse.getAccessToken()
, users.get(0)
vs.) yöntemlerini çözemezse söylüyor. Rx programlama ve lambdas için yeni - lütfen sorunun ne olduğunu söyle. Neyse kod şimdi daha temiz görünüyor.
Güncelleme 2.
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> getView().setError(processFail(throwable)))
.flatMap((AuthResponse authResponse) -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> getView().setError(processFail(throwable))), ((AuthResponse authResponse, List<User> users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
}
return Observable.just(this);
}));
böyle yaptın mı, ama şimdi benim ağ aramaları hiç yürütme değildir.
uzakta bir IDE değilim, ama hata lambda parametre adı çatışma nedeniyle olduğunu düşünüyorum . – akarnokd
Artık abone olmadığınız anlaşılıyor. Zincirin alt tarafındaki .subscribe() öğesini seçtiğinizden emin olun. –