Я работаю над созданием сетей для моего приложения. Поэтому я решил попробовать Square чрезвычайно Дооснащение . Я вижу, что они поддерживают простыеCallback
@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
и RxJava's 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 в своем ответе или в примере проекта Джейка Уортона U2020 . Но по сути вопрос остается неизменным - когда один должен использовать один или другой?