সাধারণ নেটওয়ার্কিং স্টাফের জন্য, কলব্যাকের মাধ্যমে আরএক্সজাবার সুবিধা খুব সীমিত। সহজ 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:
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);
}
}
}
});
এখন, আরএক্সজাভা ভেরিয়েন্টটি এখনও ছোট নয়, যদিও ল্যাম্বডাসের সাথে এটি কলব্যাক বৈকল্পিকের আরও নিকটবর্তী হবে। তদুপরি, আপনার যদি জেএসওএন ফিডে অ্যাক্সেস থাকে তবে আপনি যখন কেবল পিএনজি প্রদর্শন করছেন তখন সমস্ত ফটোগুলি পুনরুদ্ধার করা এক ধরণের উদ্ভট বিষয় হবে। এটিতে ফিডটি সামঞ্জস্য করুন কেবলমাত্র পিএনজি দেখায়।
প্রথম উপসংহার
আপনি সঠিক ফর্ম্যাটে থাকতে প্রস্তুত একটি সাধারণ জেএসওএন লোড করার সময় এটি আপনার কোডবেসকে ছোট করে না।
এখন, আসুন বিষয়গুলিকে কিছুটা আকর্ষণীয় করে তুলি। ধরা যাক আপনি কেবল ব্যবহারকারী ফটোটি পুনরুদ্ধার করতে চান না, তবে আপনার একটি ইনস্টাগ্রাম-ক্লোন রয়েছে এবং আপনি 2 জেএসএনএস পুনরুদ্ধার করতে চান: 1. getUserDetails () 2. getUserPhotos ()
আপনি এই দুটি JSON গুলি সমান্তরালভাবে লোড করতে চান এবং উভয়ই লোড হওয়ার পরে পৃষ্ঠাটি প্রদর্শিত হবে should কলব্যাক বৈকল্পিকটি আরও কিছুটা কঠিন হয়ে উঠবে: আপনাকে 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) {
}
});
আমরা কোথাও পাচ্ছি! আরএক্সজাভা কোডটি এখন কলব্যাক বিকল্প হিসাবে বড়। আরএক্সজাভা কোডটি আরও শক্তিশালী; আমাদের যদি তৃতীয় জেএসওন লোড করার জন্য (সর্বশেষ ভিডিওগুলির মতো) দরকার হয় তবে কী হবে? আরএক্সজাভা কেবলমাত্র একটি ছোট সামঞ্জস্য প্রয়োজন, যখন কলব্যাক বৈকল্পিক একাধিক জায়গায় সামঞ্জস্য করা প্রয়োজন (প্রতিটি কলব্যাকে আমাদের সমস্ত ডেটা পুনরুদ্ধার করা হয়েছে কিনা তা খতিয়ে দেখা উচিত)।
আরেকটি উদাহরণ; আমরা একটি স্ব-পরিপূর্ণ ক্ষেত্র তৈরি করতে চাই, যা retrofit ব্যবহার করে ডেটা লোড করে। আমরা যখনই একটি সম্পাদনা পাঠ্য পাঠ্য চ্যাঞ্জড এভেন্টে প্রতিবার ওয়েবক্যাল করতে চাই না। দ্রুত টাইপ করার সময়, শুধুমাত্র শেষ উপাদানটির কলটি ট্রিগার করা উচিত। আরএক্স জাভাতে আমরা ডিবন অপারেটরটি ব্যবহার করতে পারি:
inputObservable.debounce(1, TimeUnit.SECONDS).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// use Retrofit to create autocompletedata
}
});
আমি কলব্যাক বৈকল্পিক তৈরি করব না তবে আপনি বুঝতে পারবেন এটি আরও বেশি কাজ।
উপসংহার: ডেটা প্রবাহ হিসাবে প্রেরণ করা হলে RxJava ব্যতিক্রমীভাবে ভাল is রিট্রোফিট পর্যবেক্ষণযোগ্য একইসাথে স্ট্রিমের সমস্ত উপাদানকে ধাক্কা দেয়। কলব্যাকের তুলনায় এটি নিজের মধ্যে বিশেষভাবে কার্যকর নয়। তবে যখন স্ট্রিম এবং বিভিন্ন সময়ে একাধিক উপাদান পুশ হয় এবং আপনার সময় সম্পর্কিত-জিনিসাদি করা দরকার হয়, তখন আরএক্সজাভা কোডটিকে অনেক বেশি রক্ষণাবেক্ষণ করে তোলে।