جشنواره فطر سون لرن

آموزش کامل RxJava در اندروید - قسمت اول

دسته بندی: برنامه نویسی
سطح مقاله: متوسط
زمان مطالعه: 39 دقیقه
۰۱ خرداد ۱۳۹۹

RxJava مدتی است که معرفی شده و برنامه نویسان حتما با توانایی‌ها و کارکرد آن آشنایی دارند، اما بعضی از برنامه نویسان هنوز کار با Rxjava را شروع نکرده‌اند. اگر یکی از آن‌ها هستید، در مجموعه مقاله‌های آموزش کامل RxJava در اندروید ، ما قصد داریم مبانی مربوط به RxJava و RxAndroid را از مباحث مبتدی تا پیشرفته آموزش دهیم.

فهرست محتوای این مقاله

 برنامه نویسی واکنشی (Reactive Programming) چیست ؟

برنامه نویسی واکنشی به‌طور اساسی برنامه نویسی غیرهمزمان مبتنی بر رویداد است. هر چیزی که می‌بینید، یک جریان داده غیرهمزمان است، که می‌تواند مشاهده (Observed) شود و هنگامی که مقادیر منتشر شود، عملی صورت می‌گیرد. می‌توانید جریان داده را از هر چیزی ایجاد کنید: تغییرات متغیر، رویدادهای کلیک، فراخوانی http، ذخیره داده ها، خطاها و ... هنگامی که می‌گویم برنامه نویسی واکنشی همزمان نیست، به معنی این است که هر ماژول کد بر روی Thread خود اجرا می‌شود، بنابراین چندین بلوک کد را همزمان اجرا می‌کند.

یک مزیت رویکرد غیرهمزمان به این دلیل است که هر کار بر روی Thread خاص خود اجرا می‎شود، همه کارها می‌توانند همزمان شروع شوند و مدت زمان طول کشیدن تمام کارها، معادل کار طولانی‌تر در لیست است. وقتی صحبت از برنامه‌های تلفن همراه است، با شروع کار در (Background Thread)، می‌توانید بدون مسدود کردن Thread اصلی، به تجربه کاربری یکپارچه دست پیدا کنید.

یک مثال ساده

x می‌تواند برابر با  y + z  (x = y + z) باشد؛ که در آن مقدار y و z به x اختصاص داده می‌شود. در برنامه نویسی واکنشی (Reactive Programming)، هنگامی که مقدار y تغییر می‌کند ، مقدار x بدون اجرای مجدد عبارت x = y + z به طور خودکار به روز می‌شود. این می‌تواند با مشاهده (Observe) مقدار y یا z حاصل شود.

یک لیست آرایه می‌تواند یک جریان داده باشد و می‌توان هر بخشی را که از آن منتشر می‌شود، عملی کرد. ممکن است شما بخواهید شماره‌های زوج را فیلتر کنید و اعداد فرد را نادیده بگیرید. این کار را می‌توان با استفاده از حلقه‌های معمولی و عبارات شرطی انجام داد، اما در برنامه نویسی واکنشی می‌توانید به روش کاملاً متفاوت به این هدف دست پیدا کنید.

هنگامی که برنامه خود را در برنامه نویسی واکنشی (Reactive Programming) شروع می‌کنید، نحوه طراحی معماری و نحوه نوشتن کد به طور کامل تغییر می‌کند. حتی بیشتر قدرت می‌یابد وقتی با Clean Architecture ، MVP Architecture ، MVVM Architecture و سایر Design Patterns آشنا شوید.

پسوندهای واکنشی (Reactive Extensions)

پسوندهای واکنشی (ReactiveX یا RX) کتابخانه‌ای است که از اصول برنامه نویسی واکنش پذیر پیروی می‌کند، یعنی با استفاده از توالی قابل مشاهده (observable sequence) برنامه هایی غیرهمزمان و مبتنی بر رویدادها می‌سازد.

Reactive Extensions در چندین زبان (C++ (RxCpp)، C# (Rx.NET ، جاوا (RxJava) ، کاتلین (RxKotlin)،

سویفت (Swift (RxSwift) و موارد دیگر موجود است. ما در این مقاله به طور خاص به توضیح RxJava و RxAndroid می‌پردازیم.

RxJava چیست ؟

در ادامه‌ی مقاله‌ی آموزش کامل RxJava در اندروید ، به شما توضیح می‌دهیم که rxjava چیست؟

RxJava پیاده سازی جاوا از پسوندهای واکنشی (Reactive Extensions) است. در واقع این کتابخانه با دنبال کردن الگوی Observer، رویدادهای غیرهمزمان را می‌سازد. می‌توانید جریان داده‌ای غیرهمزمان را در هر Thread ایجاد کنید، داده‌ها را تغییر داده و توسط هر Observer در هر Thread استفاده کنید. این کتابخانه طیف گسترده ای از عملگرهای شگفت انگیز مانند نقشه ، ترکیب ، ادغام ، فیلتر و موارد دیگر را ارائه می‌دهد که می‌توانند در جریان داده استفاده شوند. این کتابخانه طیف گسترده‌ای از عملگرهای شگفت انگیز مانند map ، combine ، merge ، filter و موارد دیگر را ارائه می‌دهد که می‌توانند در جریان داده استفاده شوند.

هنگامی که شروع به کار کنید و مثال‌ها یا کد‌های واقعی بنویسید، اطلاعات شما درباره اپراتورها و تحولات بیشتر شده و بهتر آن را درک می‌کنید.

RxAndroid  چیست ؟

در این بخش مقاله‌ی آموزش کامل RxJava در اندروید ، به شما توضیح می‌دهیم که RxAndroid چیست؟

RxAndroid مخصوص به برنامه‌های اندرویدی (Android Platform) است که دارای چند کلاس اضافه در RxJava است. به طور خاص،  Schedulers در (()RxAndroid (AndroidSchedulers.mainThread  معرفی شده که نقش عمده ای در پشتیبانی از مفهوم  multithreading در برنامه‌های اندرویدی دارد. Schedulers به‌طور اساسی تصمیم می‌گیرد Thread مورد نظر که کد خاصی دارد بر روی Thread  Background اجرا شود یا بر روی Main Thread  اجرا شود. جدا از آن، هر آنچه ما استفاده می‌کنیم فقط از کتابخانه RxJava است.

برنامه‌های در دسترس بسیاری وجود دارد، به‌طور گسترده در برنامه نویسی اندروید از ()Schedulers.io و ()AndroidSchedulers.mainThread استفاده می‌شود. در زیر لیستی از Schedulers موجود و معرفی مختصر آن‌ها آورده شده است.

()io:

این مورد از Schedulers برای انجام عملیات غیر فشرده Central Processing Unit) CPU) مانند برقراری تماس‌های شبکه، خواندن دیسک / فایل ها، عملیات پایگاه داده و غیره مورد استفاده قرار می‌گیرد.

()mainThread:

این مورد از Schedulers امکان دسترسی به Main Thread /Thread UI را در اندروید فراهم می‌کند. معمولاً عملیاتی مانند به روزرسانی UI، فعل و انفعالات کاربر در این موضوع اتفاق می‌افتد. ما نباید عملیات فشرده ای را در مورد این موضوع انجام دهیم زیرا در اپلیکیشن باعث glitchy یا ANR می‌شود.

()newThread:

با استفاده از این مورد از Schedulers، هر زمان که یک کار انجام می‌شود ، Thread جدیدی ایجاد می‌شود. معمولاً توصیه می‌شود از این Schedulers استفاده نکنید، مگر اینکه عملیاتی طولانی انجام شود. Threadهای ایجاد شده از طریق ()newThread: مورد استفاده مجدد قرار نمی‌گیرند.

()computation

این مورد از Schedulers می‌توان برای انجام عملیات فشرده CPU مانند پردازش داده‌های عظیم، پردازش bitmap و غیره استفاده کرد، تعداد Threadهای ایجاد شده با استفاده از این Scheduler به طور کامل به تعداد هسته‌های موجود CPU بستگی دارد.

()single:

این مورد از Schedulers همه وظایف را به ترتیبی که اضافه شده است، انجام می‌دهد. این مورد می‌تواند در صورت لزوم اجرای متوالی مورد استفاده قرار گیرد.

()immediate:

این Scheduler بلافاصله با مسدود کردن Thread اصلی (MainThread)، کار را به صورت همزمان انجام می‌دهد.

()trampoline:

این Scheduler وظایفش را به روش First In - First Out انجام می‌دهد. تمام کارهای برنامه ریزی شده با محدود کردن تعداد

Background Threads به یک، به صورت یک به یک انجام می‌شوند.

()from:

این مورد از Schedulers به ما این امکان را می‌دهد که با محدود کردن تعداد Threadهایی که ایجاد می‌شود، Scheduler را از یک executor ایجاد کنیم. وقتی Thread Pool اشغال شد، وظایف صف می‌شوند.

اکنون ما مفاهیم اساسی لازم را داریم. بیایید با برخی از مفاهیم اصلی RxJava که همه باید از آن آگاه باشند، شروع کنیم.

مبانی RxJava : Observable، Observer

RxJava در مورد دو components مهم است:  Observable و  Observer علاوه بر این موارد، موارد دیگری مانندSchedulers ، Operators و Subscription نیز وجود دارد.

Observable :Observable یک جریان داده است که برخی از کارها را انجام می‌دهد و داده را منتشر می‌کند.

Observer :Observer بخش مهمی از Observable است. Observer داده‌های منتشر شده توسط Observable را دریافت می‌کند.

Subscription: پیوند بین Observable و Observer به عنوان Subscription خوانده می‌شود. چندین Observers کننده در یک Observable می‌توانند مشترک باشند.

Operator / Transformation: اپراتورها داده‌های منتشر شده توسط Observable را قبل از اینکه Observer آنها را دریافت کند، تغییر می‌دهد.

Schedulers :Schedulerها Threadها را تعیین و تصمیم گیری می‌کنند که Observable باید داده‌ها را منتشر کند و Observer کننده باید داده‌ها را از قبیل Background Thread ،Main Thread و... دریافت کند.

نمونه پایه‌ای از RxJava

اکنون ما در مورد برنامه نویسی Reactive ، RxJava و RxAndroid دانش نظری خوبی داریم. بیایید به چند نمونه کد برویم تا بهتر مفاهیم را درک کنیم.

اضافه کردن وابستگی‌ها (Dependencies)

برای شروع، باید وابستگی‌های RxJava و RxAndroid را به پروژه‌های خود در build.gradle اضافه کنید و پروژه را همگام سازی (sync) کنید.

// RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'

// RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

 

مراحل اساسی

Observable -1 ایجاد می‌کنیم که داده را منتشر ‌کند. در زیر ما یک Observable ایجاد کرده‌ ایم که لیستی از اسامی حیوانات را منتشر می‌کند. در اینجا از اپراتور ()just برای انتشار چند نام حیوان استفاده می‌شود.

Observable<String> animalsObservable = Observable.just("Eagle", "Bee", "Lion", "Dog", "Wolf");

Observer -2 ایجاد کنید که به Observable گوش دهد. Observer متدهای Interface زیر را برای شناخت وضعیت Observable ارائه می‌دهد.

  • ()onSubscribe : وقتی Observer عضو Observable شود، این متد فراخوانی می‌شود.
  • ()onNext : این متد هنگامی که Observable شروع به انتشار اطلاعات می‌کند، فراخوانی می‌شود.
  • ()onError : در صورت بروز هرگونه خطا، متد onError () فراخوانی می‌شود.
  • ()onComplete : هنگامی که یک Observable کننده انتشار همه موارد را انجام می‌دهد،()onComplete فراخوانی می‌شود.

RxJava

Observer<String> animalsObserver = getAnimalsObserver();
 
private Observer<String> getAnimalsObserver() {
        return new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "onSubscribe");
            }
 
            @Override
            public void onNext(String s) {
                Log.d(TAG, "Name: " + s);
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " + e.getMessage());
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "All items are emitted!");
            }
        };
    }

Observer -3 را در عضویت Observable قرار دهید تا بتواند شروع به دریافت داده کند. در اینجا، شما می‌توانید دو روش دیگر،  ()ObserveOn و ()subscribeOn را مشاهده کنید.

  • (()SubscribOn (Schedulers.io : این مورد به  Observable می‌گوید که وظیفه خود را بر روی یک                     Background Thread اجرا کند.
  • (()observeOn (AndroidSchedulers.mainThread : این مورد به Observer می‌گوید که داده‌های مربوط به Android Ui Thread را دریافت کند تا بتوانید هرگونه کار مرتبط با UI (رابط کاربری) را انجام دهید.
animalsObservable
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(animalsObserver);

اگر برنامه را اجرا کنید، می‌توانید خروجی زیر را در LogCat خود مشاهده کنید.

onSubscribe

Name: Eagle

Name: Bee

Name: Lion

Name: Dog

Name: Wolf

All items are emitted!

شما اولین برنامه RxJava خود را به همین راحتی نوشتید. ما در ادامه قصد داریم اطلاعات بیشتری درباره Schedulers و Observers کسب کنیم. اما در حال حاضر این اطلاعات برای شروع کافی است.

اساس Observable و Observer

در اینجا کد کاملی از مثال بالا آورده شده است. فعالیت را اجرا کنید و خروجی را در LogCat بررسی کنید.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import info.androidhive.rxandroidexamples.R;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
 
public class Example1Activity extends AppCompatActivity {
 
    /**
     * Basic Observable, Observer, Subscriber example
     * Observable emits list of animal names
     */
 
    private static final String TAG = Example1Activity.class.getSimpleName();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example1);
 
        // observable
        Observable<String> animalsObservable = getAnimalsObservable();
 
        // observer
        Observer<String> animalsObserver = getAnimalsObserver();
 
        // observer subscribing to observable
        animalsObservable
                .observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(animalsObserver);
    }
 
    private Observer<String> getAnimalsObserver() {
        return new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "onSubscribe");
            }
 
            @Override
            public void onNext(String s) {
                Log.d(TAG, "Name: " + s);
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " + e.getMessage());
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "All items are emitted!");
            }
        };
    }
 
    private Observable<String> getAnimalsObservable() {
        return Observable.just("Eagle", "Bee", "Lion", "Dog", "Wolf");
    }
}

onSubscribe

Name: Eagle

Name: Bee

Name: Lion

Name: Dog

Name: Wolf

All items are emitted!

معرفی Disposable

در این مثال می‌خواهیم component  جدیدی به نام Disposable را معرفی کنیم.

Disposable: زمانی که Observer دیگر نمی‌خواهد منتظر رسیدن آیتم‌ها از Observable باشد، به‌طوری دیگر به آن گوش ندهد، از Disposable برای این کار استفاده می‌شود. در اندروید Disposable برای جلوگیری از memory leaks بسیار مفید است.

برای مثال فرض کنیم که شما در حال فراخوانی طولانی شبکه هستید و رابط کاربری (UI) را به روز می‌کنید. زمانی که فراخوانی شبکه تکمیل و کار خود را تمام می‌کند، اگر Activity / Fragment از قبل از بین رفته (Destroyed) باشد، چون اشتراک Observer هنوز باقی است، سعی می‌کند Activity از قبل Destroyed شده را به روز کند. در این حالت می‌تواند باعث memory leaks شود. بنابراین با استفاده از Disposables، می‌توان در صورت از بین رفتن Activity از این مورد جلوگیری کرد.

در مثال زیر می‌توانید مشاهده کنید که از Disposable استفاده می‌شود و فراخوانی ()disposable.dispose در ()onDestroy باعث اشتراک نداشتن با Observer می‌شود.

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import info.androidhive.rxandroidexamples.R;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
 
public class Example2Activity extends AppCompatActivity {
 
    /**
     * Basic Observable, Observer, Subscriber example
     * Observable emits list of animal names
     * You can see Disposable introduced in this example
     */
    private static final String TAG = Example2Activity.class.getSimpleName();
 
    private Disposable disposable;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example2);
 
        // observable
        Observable<String> animalsObservable = getAnimalsObservable();
 
        // observer
        Observer<String> animalsObserver = getAnimalsObserver();
 
        // observer subscribing to observable
        animalsObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(animalsObserver);
    }
 
    private Observer<String> getAnimalsObserver() {
        return new Observer<String>() {
 
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "onSubscribe");
                disposable = d;
            }
 
            @Override
            public void onNext(String s) {
                Log.d(TAG, "Name: " + s);
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " + e.getMessage());
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "All items are emitted!");
            }
        };
    }
 
    private Observable<String> getAnimalsObservable() {
        return Observable.just("Eagle", "Bee", "Lion", "Dog", "Wolf");
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        // don't send events once the activity is destroyed
        disposable.dispose();
    }
}

این کد همان خروجی مشابه نمونه قبلی را تولید می‌کند.

onSubscribe

Name: Eagle

Name: Bee

Name: Lion

Name: Dog

Name: Wolf

All items are emitted!

عملگرهای RxJava Operators) RxJava) 

در این بخش مقاله‌ی آموزش کامل RxJava در اندروید ، عملگرهای RxJava Operators) RxJava) را برای شما شرح می‌دهیم.

  •  Introduction
  • Map
  • Buffer
  • Debounce
  • ThrottleFirst
  • FlatMap
  • ConcatMap
  • SwitchMap
نکته :

معرفی(Introduction)

کار یک اپراتور به شرح زیر است :

اپراتورها مواردی را که توسط یک Observable منتشر می‌شود را تبدیل می‌کنند.

در زیر برخی از متداول‌ترین اپراتورهای دگرگونی وجود دارد که فرض می‌کنیم شما از آن‌ها استفاده می‌کنید.

Map

یک تابع را برای هر مورد منتشر شده اعمال می‌کند. با استفاده از تابعی از آن، هر مورد منتشر شده را تغییر می‌دهد.

(نظم ارسال حفظ می‌شود)

نمودار Map :

آموزش کامل RxJava در اندروید

Buffer

به‌طور دوره ای items را از یک Observable به صورت bundles جمع می‌کند و به جای اینکه یکبار items را منتشر کند، bundles را منتشر می‌کند. (نظم ارسال حفظ می‌شود)

نمودار :

آموزش کامل RxJava در اندروید

Debounce

اگر یک زمان خاص گذشته باشد، یک Item را از یک Observable منتشر می‌کند بدون آنکه یک Item دیگر را منتشر کند. این عملگر برای کلیک دکمه (button clicks) بسیار عالی است. اگر کاربر بارها و بارها یک دکمه را کلیک کند، دیگر نیازی به اجرای چندین بار کار نیست. می‌توانیم از اپراتور ()Debounce استفاده کنیم تا با معرفی یک بازه زمانی مجاز بین کلیک، کلیک‌های خود را کنترل کنیم. اگر مدت زمانی سپری نشده باشد، می‌توانیم از هر دو متد جلوگیری کنیم. (نظم ارسال حفظ می‌شود)

نمودار :

ThrottleFirst

موارد منتشر شده توسط منبع Observable را که در یک بازه زمانی قرار دارند، فیلتر می‌کند.(نظم ارسال حفظ می‌شود)

نمودار :

آموزش کامل RxJava در اندروید

FlatMap

موارد منتشر شده توسط یک Observable را به Observables تبدیل می‌کند، و سپس انتشار از آن را به یک Observable Single قسمت می‌کند. اگر با LiveData آشنا باشید، MediatorLiveData می‌تواند کاری بسیار مشابه انجام دهد. در مورد ()FlatMap در ادامه بیشتر صحبت می‌کنیم. (نظم ارسال حفظ نمی‌شود)

نمودار :

آموزش کامل RxJava در اندروید

ConcatMap

موارد منتشر شده توسط یک Observable را به Observables تبدیل می‌کند. این در اصل همان مورد ()FlatMap است، اما نظم ارسال حفظ می‌شود. اما از آنجا که ()ConcatMap باید منتظر بماند تا هر یک از Observable کار خود را انجام دهند پس از نظر فنی آن غیر همزمان نیست. (نظم ارسال حفظ می‌شود)

نمودار :

آموزش کامل RxJava در اندروید

SwitchMap

()SwitchMap آیتم‌های منتشر شده توسط یک Observable را به یک Observable تبدیل می‌کند درست مثل ()ConcatMap  و ()FlatMap. تفاوت این است که به محض مشترک شدن یک Observer جدید، Observer  قبلی را لغو می‌کند. اساساً ()SwitchMap  محدودیتی را حل می‌کند که ()ConcatMap و ()FlatMap هم دارند.(نظم ارسال حفظ می‌شود)

نمودار :

Observers چندگانه و CompositDisposable

یک مورد را در نظر بگیرید که دارای چندین Observables  و Observers باشد. Dispose کردن آنها یک به یک در Destroy یک کار خسته کننده است و ممکن است در معرض خطا باشد به این دلیل که شاید شما Dispose کردن را فراموش کنید. در این حالت می‌توانیم از CompositeDisposable استفاده کنیم.

CompositeDisposable 

CompositeDisposable می‌تواند لیست اشتراک‌ها (subscriptions) را در یک استخر حفظ کند و می‌تواند همه آن‌ها را یک باره Dispose کند. معمولاً ما ()compositeDisposable.clear را در ()onDestroy فراخوانی می‌کنیم اما شما می‌توانید جای دیگری که خودتان می‌خواهید آن را فراخوانی کنید.

در مثال زیر، شما می‌توانید متوجه شوید که دو animalsObserver ،Observer و animalsObserverAllCaps در همان Observable مشترک هستند. هر دو Observer داده‌های یکسانی را دریافت می‌کنند اما داده‌ها با اعمال اپراتورهای مختلف در stream تغییر می‌کنند.

  • AnimalObserver : از عملگر ()filter برای فیلتر کردن نام حیوانات با حرف "b" استفاده می‌شود.
  • AnimalObserverAllCaps : عملگر ()filter برای فیلتر کردن نام حیوانات با شروع حرف "c" استفاده می‌شود. از نقشه عملگر map() بعدی برای تبدیل نام هر حیوانی به حروف بزرگ استفاده می‌شود. استفاده از چندین اپراتور روی یک observer  مفرد، زنجیره عملگرها نام (chaining of operators) دارد.
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import info.androidhive.rxandroidexamples.R;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
 
public class Example4Activity extends AppCompatActivity {
 
    /**
     * Basic Observable, Observer, Subscriber example
     * Observable emits list of animal names
     * You can see filter() operator is used to filter out the
     * animal names that starts with letter `b`
     */
    private static final String TAG = Example4Activity.class.getSimpleName();
 
    private CompositeDisposable compositeDisposable = new CompositeDisposable();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example4);
 
        Observable<String> animalsObservable = getAnimalsObservable();
 
        DisposableObserver<String> animalsObserver = getAnimalsObserver();
 
        DisposableObserver<String> animalsObserverAllCaps = getAnimalsAllCapsObserver();
 
        /**
         * filter() is used to filter out the animal names starting with `b`
         * */
        compositeDisposable.add(
                animalsObservable
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .filter(new Predicate<String>() {
                            @Override
                            public boolean test(String s) throws Exception {
                                return s.toLowerCase().startsWith("b");
                            }
                        })
                        .subscribeWith(animalsObserver));
 
        /**
         * filter() is used to filter out the animal names starting with 'c'
         * map() is used to transform all the characters to UPPER case
         * */
 
        compositeDisposable.add(
                animalsObservable
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .filter(new Predicate<String>() {
                            @Override
                            public boolean test(String s) throws Exception {
                                return s.toLowerCase().startsWith("c");
                            }
                        })
                        .map(new Function<String, String>() {
                            @Override
                            public String apply(String s) throws Exception {
                                return s.toUpperCase();
                            }
                        })
                        .subscribeWith(animalsObserverAllCaps));
    }
 
    private DisposableObserver<String> getAnimalsObserver() {
        return new DisposableObserver<String>() {
 
            @Override
            public void onNext(String s) {
                Log.d(TAG, "Name: " + s);
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " + e.getMessage());
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "All items are emitted!");
            }
        };
    }
 
    private DisposableObserver<String> getAnimalsAllCapsObserver() {
        return new DisposableObserver<String>() {
 
 
            @Override
            public void onNext(String s) {
                Log.d(TAG, "Name: " + s);
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " + e.getMessage());
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "All items are emitted!");
            }
        };
    }
 
    private Observable<String> getAnimalsObservable() {
        return Observable.fromArray(
                "Ant", "Ape",
                "Bat", "Bee", "Bear", "Butterfly",
                "Cat", "Crab", "Cod",
                "Dog", "Dove",
                "Fox", "Frog");
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        // don't send events once the activity is destroyed
        compositeDisposable.clear();
    }
}

اگر این مثال را اجرا کنید، می‌توانید خروجی زیر را مشاهده کنید. در اینجا نام حیواناتی که با "B" شروع می‌شوند توسط animalsObserver ،Observed می‌شوند و همه نام‌های شروع شده با حرف "c" و همه animalsObserverAllCaps با Observed می‌شوند.

Name: Bat

Name: Bee

Name: Bear

Name: Butterfly

All items are emitted!

Name: CAT

Name: CRAB

Name: COD

All items are emitted!

جمع بندی:

در قسمت اول مقاله‌ی آموزش کامل RxJava در اندروید ، به طور کلی با RxJava و RxAndroid آشنا شدیم. در قسمت‌های بعدی این مقاله همراه ما باشید تا با RxJava و ویژگی‌های آن بیشتر آشنا شوید. تا پایان مجموعه مقالات آموزش کامل RxJava در اندروید ، شما  از یک توسعه دهنده تازه کار به توسعه دهنده متوسط در RxJava تبدیل می‌شوید. اگر در این زمینه تجربه‌ای یا سوالی دارید خوشحال می‌شویم که با ما و کاربران وب سایت سون لرن به اشتراک بگذارید.

بیشتر بدانید:

یاد گیری برنامه نویسی اندروید و پیش نیاز‌های آن

روش کسب درآمد از برنامه نویسی اندروید

برنامه نویسی اندروید چیست؟

منابع این مقاله:

github.com

Reactivx.io

اگر به یادگیری بیشتر در زمینه‌ی برنامه نویسی اندروید علاقه داری، با شرکت در دوره‌ی آموزشی متخصص اندروید در کمتر از یکسال به یک توسعه‌دهنده اندروید همه فن حریف تبدیل می‌شوی که آماده‌ی استخدام، دریافت پروژه و حتی پیاده‌سازی اپلیکیشن خودت هستی.

 

چه امتیازی به این مقاله می دید؟

نظرات کاربران

Parsa Dadras

بسیار عالی ، ممنونم

ماندانا مهرپور

سلام و عرض ادب
عالی بخدااا
من الان فهمیدم چی به چیه.انشاالله ادامه رو سریعا بگذارید .خدا خیرتون بده.
بازم ممنون

امیر حسین حیدری

سلام خدمت شما ممنون نظر لطفتون هست سعی میکنم هر چی سریع تر به دستتون برسه

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :