Tôi đang làm việc trên mạng cho ứng dụng của mình. Vì vậy, tôi quyết định dùng thử Retrofit của Square . Tôi thấy rằng họ hỗ trợ đơn giảnCallback
@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
và của RxJava Observable
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
Cả hai trông khá giống nhau từ cái nhìn đầu tiên, nhưng khi được triển khai, nó trở nên thú vị ...
Trong khi với việc thực hiện gọi lại đơn giản sẽ trông tương tự như thế này:
api.getUserPhoto(photoId, new Callback<Photo>() {
@Override
public void onSuccess() {
}
});
đó là khá đơn giản và đơn giản. Và với Observable
nó nhanh chóng được dài dòng và khá phức tạp.
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());
}
Và đó không phải là nó. Bạn vẫn phải làm một cái gì đó như thế này:
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?
}
});
Am i thiếu cái gì ở đây? Hoặc đây là một trường hợp sai để sử dụng Observable
s? Khi nào nên / nên thích Observable
hơn Callback đơn giản?
Cập nhật
Sử dụng trang bị thêm đơn giản hơn nhiều so với ví dụ ở trên như @Niels đã thể hiện trong câu trả lời của anh ấy hoặc trong dự án ví dụ U2020 của Jake Wharton . Nhưng về cơ bản câu hỏi vẫn giữ nguyên - khi nào nên sử dụng cách này hay cách khác?