Basit ağ iletişimi için, RxJava'nın Geri Arama'dan avantajları çok sınırlıdır. Basit getUserPhoto örneği:
RxJava:
api.getUserPhoto(photoId)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Photo>() {
@Override
public void call(Photo photo) {
// do some stuff with your photo
}
});
Geri aramak:
api.getUserPhoto(photoId, new Callback<Photo>() {
@Override
public void onSuccess(Photo photo, Response response) {
}
});
RxJava varyantı Geri Arama varyantından daha iyi değildir. Şimdilik, hata işlemeyi görmezden gelelim. Fotoğrafların bir listesini alalım:
RxJava:
api.getUserPhotos(userId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<List<Photo>, Observable<Photo>>() {
@Override
public Observable<Photo> call(List<Photo> photos) {
return Observable.from(photos);
}
})
.filter(new Func1<Photo, Boolean>() {
@Override
public Boolean call(Photo photo) {
return photo.isPNG();
}
})
.subscribe(
new Action1<Photo>() {
@Override
public void call(Photo photo) {
list.add(photo)
}
});
Geri aramak:
api.getUserPhotos(userId, new Callback<List<Photo>>() {
@Override
public void onSuccess(List<Photo> photos, Response response) {
List<Photo> filteredPhotos = new ArrayList<Photo>();
for(Photo photo: photos) {
if(photo.isPNG()) {
filteredList.add(photo);
}
}
}
});
Şimdi, RxJava varyantı hala daha küçük değil, ancak Lambdas ile Geri Arama varyantına daha yakın olacak. Ayrıca, JSON özet akışına erişiminiz varsa, yalnızca PNG'leri görüntülerken tüm fotoğrafları almak biraz garip olur. Özet akışını yalnızca PNG'leri görüntüleyecek şekilde ayarlayın.
İlk sonuç
Doğru biçimde olmaya hazırladığınız basit bir JSON yüklediğinizde kod tabanınızı küçültmez.
Şimdi işleri biraz daha ilginç hale getirelim. Diyelim ki sadece userPhoto almak değil, aynı zamanda bir Instagram-clone var ve 2 JSON almak istiyorsunuz: 1. getUserDetails () 2. getUserPhotos ()
Bu iki JSON'u paralel olarak yüklemek istiyorsunuz ve her ikisi de yüklendiğinde sayfanın görüntülenmesi gerekiyor. Geri arama varyantı biraz daha zorlaşacaktır: 2 geri arama oluşturmanız, verileri etkinlikte saklamanız ve tüm veriler yüklenmişse sayfayı görüntülemeniz gerekir:
Geri aramak:
api.getUserDetails(userId, new Callback<UserDetails>() {
@Override
public void onSuccess(UserDetails details, Response response) {
this.details = details;
if(this.photos != null) {
displayPage();
}
}
});
api.getUserPhotos(userId, new Callback<List<Photo>>() {
@Override
public void onSuccess(List<Photo> photos, Response response) {
this.photos = photos;
if(this.details != null) {
displayPage();
}
}
});
RxJava:
private class Combined {
UserDetails details;
List<Photo> photos;
}
Observable.zip(api.getUserDetails(userId), api.getUserPhotos(userId), new Func2<UserDetails, List<Photo>, Combined>() {
@Override
public Combined call(UserDetails details, List<Photo> photos) {
Combined r = new Combined();
r.details = details;
r.photos = photos;
return r;
}
}).subscribe(new Action1<Combined>() {
@Override
public void call(Combined combined) {
}
});
Bir yere gidiyoruz! RxJava kodu artık geri arama seçeneği kadar büyük. RxJava kodu daha sağlamdır; Yüklenmesi için üçüncü bir JSON'a ihtiyacımız olursa ne olacağını düşünün (en yeni Videolar gibi)? Geri arama varyantının birden fazla yerde ayarlanması gerekirken, RxJava'nın sadece küçük bir ayarlaması gerekir (her geri aramada tüm verilerin geri getirilip getirilmediğini kontrol etmemiz gerekir).
Başka bir örnek; Retrofit kullanarak veri yükleyen bir otomatik tamamlama alanı oluşturmak istiyoruz. EditText'te her TextChangedEvent olduğunda web araması yapmak istemiyoruz. Hızlı yazarken, aramayı yalnızca son öğe tetiklemelidir. RxJava'da geri alma işlecini kullanabiliriz:
inputObservable.debounce(1, TimeUnit.SECONDS).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// use Retrofit to create autocompletedata
}
});
Geri Arama varyantını oluşturmayacağım, ancak bunun çok daha fazla iş olduğunu anlayacaksınız.
Sonuç: Veri akış olarak gönderildiğinde RxJava son derece iyidir. Retrofit Gözlemlenebilir, akıştaki tüm öğeleri aynı anda iter. Bu, Geri Arama ile karşılaştırıldığında kendi başına özellikle yararlı değildir. Ancak, akışa ve farklı zamanlarda itilen birden fazla öğe olduğunda ve zamanlama ile ilgili şeyler yapmanız gerektiğinde, RxJava kodu çok daha sürdürülebilir hale getirir.