آشنائی با RxJava در اندروید

شاید شما هم از قابلیتهای Rxjava شنیده باشین ولی هنوز از اون توی پروژه‌هاتون استفاده نکرده باشید. خب برای شروع کمی دیر هست ولی ایرادی نداره. دیر رسیدن بهتر از هرگز نرسیدنه. در این آموزشها سعی میکنم توضیحی ساده از اینکه Rxjava و RxAndroid چیه و چه کمکی میکنه ارائه کنم.

برنامه نویسی Reactive نوعی از برنامه نویسی واکنش گرا است. هر چیزی که شما مشاهده می کنید جریانی از اطلاعات ناهمگامه که قابلیت مشاهده شدن دارن و بر اساس اون یک اتفاق رخ میده(همون علت و معلول خودمون). شما این جریان داده ها رو می تونید از هر چی بسازید. مثلا اگر متغیری تغییر می کنه، کاربر کلیکی انجام میده، فراخوانی اطلاعاتی از اینترنت انجام میشه، داده ای ذخیره میشه، خطائی رخ میده و ... . منظور از ناهمگام هم اینه که هر کدام از اینها میتونند در چندین اتفاق به صورت موازی و غیرهمزمان رخ بدهد.

یکی از مزایای غیرهمزمانی اینه که این قابلیت وجود داره که هر کدام از این علت و معلولها رو مستقلا مدیریت کرد. وقتی که این روش وارد به برنامه های موبایل میشن به این معنی که شما می تونید بعضی از کارها رو در پس زمینه اجرا کنید تا مشکلی در تجربه کاربری پیش نیاد.

یک مثال ساده: x = y + z را در نظر بگیرید که مجموع y و z در x قرار میگیره. در برنامه نویسی Reactive وقتی y تغییر میکنه مقدار x بدون اینکه دستور x=y+z اجرا بشه آپدیت میشه. این اتفاق با مشاهده مدام y و z اتفاق می افته.

حالا یک مورد دیگه:مثلایک آرایه از داده ها رو در نظر بگیرید که می تونه از هر جائی گرفته شده باشه. ممکنه شما بخواین اعداد زوج رو فیلتر کنین و اعداد فرد رو از اون جدا کنید. این میتونه با یک حلقه و شرط معمولی انجام بشه. اما همین کار رو با یک نگرش جدید در برنامه نویسی reactive انجامش بدین.

یک مثال واقعی تر: مثلا شما در حال تماشای فوتبال هستید. اطلاعات زیادی از بازی فوتبال در حال انتشار هستند. مثلا کدام بازیکن در چه دقیقه ای گل زد، چه کسی کارت زرد گرفت و ... . بازی در هر لحظه در حال انتشار اطلاعات جدیده و شما به عنوان مشاهده گر مشغول تماشای بازی هستید.

افزونه های Reactive

افزونه های reactive کتابخانه هائی هستند که از اصول reactive پیروی میکنن مثلا می تونند یک برنامه واکنش گرا با استفاده از چندین توالی مشاهدات ایجاد کنند. این کتابخونه ها می تونند با استفاده از واسطها و متدها به برنامه نویسان کمک کنند تا کدهای ساده تر و تمیزتری بنویسند.

RXJava چیه؟

یکی از این کتابخونه ها RxJava است که توسط شرکت Netflix توسعه داده شده است. این کتابخونه میتونه رویدادهای غیرهمزمان رو مدیریت کنه و در تردهای مختلف اجرا کنه. تعداد زیادی از اپراتورها رو برای تغییر در داده ها اجرا کنه.

RxAndroid چیه؟

پلتفرمیه که یکسری قابلیتها رو به RxJava اضافه میکنه. به طور خاص Schedulers و AndroidSchedulers.mainThread که فقط در برنامه نویسی اندروید کاربرد داره.

اجزای Rxjava:

Observable:

به معنی مشاهدات و جریانی از داده ها که کاری رو انجام میدند یا اطلاعات رو ارسال میکنند.

Observer:

به معنا مشاهده گر و داده ها رو از Observable میگیره.

Operator / Transformation:

اپراتورها دیتاهای رو که توسط Observable ارسال شده را قبل از اینکه توسط Observer دریافت شود را تغییر می دهد.

Scheduler:

تصمیم میگیرند کدام ترد روی Observable بایستی داده ارسال کند و کدام Observer بایستی داده ها رو دریافت کند. به طور مثال background thread یا main thread.

شروع کار در اندروید:

حالا بایستی RxAndrodi و Rxjava را به build.gradle اضافه کنید:

// RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'
// RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

می دانیم وظیفه Observable ارسال اطلاعات است. ابتدا بایستی یک Observable بسازیم. برای قرار دادن اطلاعات در یک Observable روشهای زیادی وجود داره که ساده ترین آن استفاده از just است.

Observable<String> animalsObservable = Observable.just("Ant", "Bee", "Cat", "Dog", "Fox");

داستان Observable به شکل زیر است:

حالا باید یک مشاهده گر بسازیم که Observable را مشاهده کند. یک مشاهده گر متدهای زیر را برای اطلاع از وضعیت Observable دارد که با آن آشنا می شویم:

  • onSubscribe():میشود Observable زمانی فراخوانی میشود که مشاهده گر مشترک
  • onNext(): اطلاعات را ارسال میکند Observable زمانی فراخوانی میشود که
  • onError(): در زمان بروز خطا فراخوانی میشود
  • onComplete():تکمیل میشود فراخوانی میگردد Observable زمانی که ارسال اطلاعات توسط

تعریف Observer

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 بایستی به Observable متصل شود که اصطلاحا به آن subscribe میگوییم. به این معنی که observer مشترک Observable شده است. مثل اشتراک روزنامه که در اون پس از انتشار روزنامه یک نسخه از اون به خواننده ارسال میشه.

 animalsObservable 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(animalsObserver); 

subscribeOn(Schedulers.io()) میگه که در ترد بکگراند اجرا شود Observable به

observeOn(AndroidSchedulers.mainThread())

به Observer میگه اطلاعات رو در android UI thread دریافت کند.

نتیجه برنامه:

onSubscribe

Name: Ant

Name: Bee

Name: Cat

Name: Dog

Name: Fox

All items are emitted!