アプリのネットワーキングに取り組んでいます。そこで、Square のRetrofitを試してみることにしました。彼らはシンプルをサポートしていることがわかりますCallback
@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
そしてRxJavaのObservable
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
どちらも一見するとよく似ていますが、実装すると面白くなります...
単純なコールバックの実装では、次のようになります。
api.getUserPhoto(photoId, new Callback<Photo>() {
@Override
public void onSuccess() {
}
});
これは非常に単純で簡単です。そして、Observable
すぐに冗長になり、非常に複雑になります。
public Observable<Photo> getUserPhoto(final int photoId) {
return Observable.create(new Observable.OnSubscribeFunc<Photo>() {
@Override
public Subscription onSubscribe(Observer<? super Photo> observer) {
try {
observer.onNext(api.getUserPhoto(photoId));
observer.onCompleted();
} catch (Exception e) {
observer.onError(e);
}
return Subscriptions.empty();
}
}).subscribeOn(Schedulers.threadPoolForIO());
}
それだけではありません。あなたはまだ次のようなことをしなければなりません:
Observable.from(photoIdArray)
.mapMany(new Func1<String, Observable<Photo>>() {
@Override
public Observable<Photo> call(Integer s) {
return getUserPhoto(s);
}
})
.subscribeOn(Schedulers.threadPoolForIO())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Photo>() {
@Override
public void call(Photo photo) {
//save photo?
}
});
ここで何か不足していますか?Observable
または、これはsを使用するのに間違ったケースですか? Observable
単純なコールバックよりも優先する/する必要があるのはいつですか?
アップデート
@Niels が彼の回答または Jake Wharton のサンプル プロジェクトU2020で示したように、レトロフィットの使用は上記の例よりもはるかに簡単です。しかし、基本的に質問は同じままです - いつどちらの方法を使用する必要がありますか?