सरल नेटवर्किंग सामान के लिए, कॉलबैक पर आरएक्सजाव के फायदे बहुत सीमित हैं। सरल getUserPhoto उदाहरण:
RxJava:
api.getUserPhoto(photoId)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Photo>() {
@Override
public void call(Photo photo) {
// do some stuff with your photo
}
});
वापस कॉल करें:
api.getUserPhoto(photoId, new Callback<Photo>() {
@Override
public void onSuccess(Photo photo, Response response) {
}
});
RxJava वैरिएंट Callback वैरिएंट से ज्यादा बेहतर नहीं है। अभी के लिए, आइए त्रुटि से निपटने की उपेक्षा करें। आइए तस्वीरों की एक सूची लेते हैं:
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)
}
});
वापस कॉल करें:
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);
}
}
}
});
अब, RxJava वैरिएंट अभी भी छोटा नहीं है, हालांकि लैम्बडा के साथ यह कॉलबैक वेरिएंट के करीब होगा। इसके अलावा, यदि आपके पास JSON फ़ीड तक पहुँच है, तो सभी फ़ोटो पुनः प्राप्त करने के लिए यह अजीब तरह का होगा जब आप केवल PNG प्रदर्शित कर रहे हों। बस फ़ीड को इसमें समायोजित करें केवल पीएनजी प्रदर्शित करता है।
पहला निष्कर्ष
जब आप एक साधारण JSON लोड कर रहे होते हैं, जिसे आप सही प्रारूप में तैयार करते हैं तो यह आपके कोडबेस को छोटा नहीं बनाता है।
अब, चीजों को थोड़ा और दिलचस्प बनाते हैं। मान लें कि आप न केवल उपयोगकर्ता फोटो को पुनः प्राप्त करना चाहते हैं, बल्कि आपके पास एक इंस्टाग्राम-क्लोन है, और आप 2 JSONs को पुनः प्राप्त करना चाहते हैं: 1. getUserDetails () 2. getUserPhotos ()
आप इन दो JSON को समानांतर में लोड करना चाहते हैं, और जब दोनों लोड होते हैं, तो पृष्ठ प्रदर्शित किया जाना चाहिए। कॉलबैक संस्करण थोड़ा और कठिन हो जाएगा: आपको 2 कॉलबैक बनाने होंगे, डेटा को गतिविधि में संग्रहीत करना होगा, और यदि सभी डेटा लोड किया गया है, तो पृष्ठ प्रदर्शित करें:
वापस कॉल करें:
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) {
}
});
हम कहीं मिल रहे हैं! RxJava का कोड अब कॉलबैक विकल्प जितना बड़ा है। RxJava कोड अधिक मजबूत है; सोचिए अगर हमें लोड किए जाने वाले तीसरे JSON (नवीनतम वीडियो की तरह) की आवश्यकता हो, तो क्या होगा? RxJava को केवल एक छोटे समायोजन की आवश्यकता होगी, जबकि कॉलबैक संस्करण को कई स्थानों पर समायोजित करने की आवश्यकता है (प्रत्येक कॉलबैक पर हमें यह जांचने की आवश्यकता है कि क्या सभी डेटा पुनर्प्राप्त किए गए हैं)।
एक और उदाहरण; हम एक स्वत: पूर्ण फ़ील्ड बनाना चाहते हैं, जो रेट्रोफ़िट का उपयोग करके डेटा लोड करता है। जब भी एक EditText में TextChangedEvent होता है, हम हर बार एक वेबकॉल नहीं करना चाहते हैं। तेजी से टाइप करते समय, केवल अंतिम तत्व को कॉल ट्रिगर करना चाहिए। RxJava पर हम डेब्यू ऑपरेटर का उपयोग कर सकते हैं:
inputObservable.debounce(1, TimeUnit.SECONDS).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// use Retrofit to create autocompletedata
}
});
मैं कॉलबैक संस्करण नहीं बनाऊंगा, लेकिन आप समझेंगे कि यह बहुत अधिक काम है।
निष्कर्ष: डेटा स्ट्रीम के रूप में भेजे जाने पर RxJava असाधारण रूप से अच्छा है। रेट्रोफिट ऑब्जर्वेबल सभी तत्वों को एक ही समय में स्ट्रीम पर धकेलता है। यह कॉलबैक की तुलना में अपने आप में विशेष रूप से उपयोगी नहीं है। लेकिन जब धारा और अलग-अलग समय पर कई तत्व धकेल दिए जाते हैं, और आपको समय से संबंधित सामान करने की आवश्यकता होती है, तो RxJava कोड को बहुत अधिक बनाए रखता है।