اپراتور defer
جمعه, ۱ اسفند ۱۳۹۹، ۰۵:۵۱ ب.ظ
فلوی اجرای کدهای RxJava به این صورت هست:
اول Observable ساخته میشه، سپس Subscriber (یا همون observable) بهش متصل میشه، پس از آن با توجه به تردی که در subscribeOn مشخص شده، عملیات اپراتورها در آن ترد انجام شده و در نهایت، با توجه به تردی که توسط observeOn معرفی می گردد، در ترد مذکور منتشر می شود.
بنابراین دیتای Observable هنگامی که observer به آن متصل می شود، ارزیابی می گردد. اما در اپراتورهای just و from به این صورت نیست و دیتای observable در لحظه ای که دیتا ساخته می شود، ارزیابی خواهد شد.
برای حل این مشکل می توان از اپراتور defer استفاده کرد. یعنی just و from رو در defer قرار دهیم. (defer به معنی "تاخیر انداختن" است) در این صورت این اپراتورها نیز مانند فلوی توضیح داده شده عمل خواهند کرد. اینجا بیشتر توضیح داده
به دو کد زیر توجه شود.
s = "Maryam";
@NonNull Observable<String> just = Observable.just(s);
s = "Maryam goli";
just.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.d(TAG, s); // Maryam
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
s = "Maryam";
@NonNull Observable<String> defer = Observable.defer(new Supplier<ObservableSource<String>>() {
@Override
public ObservableSource<String> get() throws Throwable {
return Observable.just(s);
}
});
s = "Maryam goli";
defer.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.d(TAG, s); // Maryam goli
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
۹۹/۱۲/۰۱
مطالب مفیدی بود ممنون از شما.