آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

طبقه بندی موضوعی

اپراتور 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() {

    }
});
موافقین ۱ مخالفین ۰ ۹۹/۱۲/۰۱
میم دال

نظرات  (۱)

مطالب مفیدی بود ممنون از شما.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی