۲۸ مهر ۹۶ ، ۱۷:۲۹
سجاد یوسف نیا ۱ نظر Share

شروع کار با RXJava2 برای اندروید

در پایان این مجموعه ها شما به مبانی RXJava 2 مسلط خواهید شد سپس قادر خواهید بود تا شروع به ساخت برنامه های واکنشی سطح بالایی کنید که می توانند شامل تعداد زیادی از داده های سنکرون و آسنکرون باشد. همه ی کدهای مورد استفاده ی شما خلاصه تر خواهد شد و قابلیت مدیریت راحت تری خواهید داشت نسبت به آن چیزی که همیشه فقط صرفا با استفاده از جاوا می سازید.

این معرفی نامه ی RXJava علاوه بر ارائه برای مبتدیان، برای شمایی که در RXJava 1 تجربیاتی دارید و به دنبال جایگزین کردن RXJava 2 هستید هم،  ارائه می شود، این مجموعه ها به شما کمک خواهد کرد تا این انتقال(از RXJava1 به RXJava 2) بسیار آسان و بی دردسر باشد. با اینکه آپگرید آخرین نسخه ی یک کتابخانه چندان دشوار به نظر نمی رسد ولی RXJava 2 معمولا چندان به روز نیست _ یعنی منظورم اینه که کاملا از RXJava قبلی بازنویسی  شده است. با اندکی تغییر امکان گیج شدن وجود دارد،بنابراین اگر شما که تازه کار هستید حتی اگر مقداری زمان برای یادگیری آرایکس صرف کنید راه دوری نرفته و باعث خواهد شد که در زمانتون در بلند مدت صرفه جویی کنید و مقدار اشتباهاتتون کمتر بشه

در این پست، من این که RXJava چی هست و این که چه مزایای کلیدی را به توسعه دهندگان اندروید می دهد را مفصلا براتون شرح می دهم. ما همچنین یک نگاه عمیق تر به اجزای اصلی پروژه یعنی Obesrvers و Observables و Subscriptions خواهیم انداخت. در انتهای این آموزش شما یک برنامه با استایل "Hello World" خواهید ساخت که شامل همه ی این اجزای اصلی خواهد بود.

دیگر قطعات اصلی سازنده ی RXJava "عملگرها" هستند ، بنابراین در قسمت دوم من به دنبال راههای متفاوتی هستم تا بتوانید از عملگرها برای انتقال، ترکیب، فیلتربندی، و دستکاری داده های برنامه ها استفاده کنید.

در قسمت پایانی ، ما پامون رو فراتر از RXJava میگذاریم و نگاهی به RXAndroid میندازیم، RXAndroid یک کتابخانه ی کامل که همه ی افزونه های اندرویدی که از آنها برای استفاده ی کامل از توانایی کامل برنامه نویسی واکنشی برای اندروید رو دارید رو در خودش داره. 

ما قسمت های زیادی را تحت پوشش می دهیم ، حال بیایید مبانی این بحث را شروع کنیم:

اصلا RXJava چی هست؟

RXJava یک کتابخانه ای هست که به شما این امکان را می دهد تا بتوانید برنامه هایی را به استایل و فرم واکنشی بسازید. اصولا برنامه نویسی واکنشی یک راه شسته رفته و کارآمد برای پردازش و واکنش به داده های بلادرنگ است که این داده ها اصولا دارای مقادیر پویا هستند.

شکل این استریم های داده ضرورتا به صورت داده های پیش پا افتاده نیست و تقریبا هر نوع استریمی از داده را پشتیبانی میکند، همه چیز !. از متغییرها گرفته تا ویژگی ها، کش ها، و حتی رویدادهای ورودی کاربر مانند کلیک ها و swipeها.

  داده های منتشر شده به وسیله ی هر استریم می تواند یک مقدار، خطا یا یک سیگنال کامل شدن باشد ، اگرچه شما ضرورتا مجبور نیستید دو مورد اخیر را حتما پیاده سازی کنید. وقتی که استریم های منتشر کننده ی داده ها ، را ساختید، بایستی آنها را با آبجکت های Reactive ای که از استریم ها استفاده می کنند ترکیب کنید و سپس روی داده ها کاری انجام دهید،این که چه کاری را قادر باشیم انجام دهیم وابسته به این است که چه استریمی منتشر شده است. RXJava شامل یک دسته ی کاملی از عملگرهای سودمند برای کار کردن با استریم ها است، مواردی چون filtering, mapping , delaying , counting که انجام کارهای مختلف آسانتر خواهد شد.


برای ساخت گردش کار(ورک فلوی) از استریم های داده ها و آبجکت هایی که به آنها واکنش نشان می دهند، RXJava الگوی طراحی  Observer را ایکستند می کند ، اساسا ، در RXJava شما آبجکت های Observable ای دارید که یک استریم از داده را منتشر می کنند و سپس پایان می یابند، و آبجکت های Observer ای به Observable ها ملحق می شوند. هرگاه که Observable یک مقدار، خطا یا سیگنال کامل شدن منتشر کند Observer متصل به آن اطلاع پیدا می کند.
بنابراین به صورت کلی RXJava همه اش در موارد زیر خلاصه می شود:
  • ساخت یک Observable
  • دادن مقداری اطلاعات به Observable برای منتشر کردن
  • ساخت یک Observer
  • اختصاص Observer به یک Observable
  • محول کردن وظایفی به Observer که موقعی باید انجام بدهد که از Observable مخصوصش اطلاعات منتشر شده را دریافت کرد.
چرا باید از RXJava استفاده کنیم؟
آموختن هر فناوری تازه احتیاج به زمان و تلاش دارد ، و RXJava به عنوان یک کتابخانه ی داده محور همیشه آسان ترین API برای کار کردن نیست.
برای این که به شما کمک کنم که تصمیم بگیرید که عایا RXJava ارزش سرمایه گذاری اولیه را دارد یا نه، مزایای مهم و کلیدی افزودن کتابخانه ی RXJava به پروژه های اندرویدی را با هم بررسی می کنیم.
خلاصه تر بودن در عین خوانا بودن

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

حتی اگر پروژه ی شما بدون هیچگونه خطایی ساخته شود پیچیدگی کد می تواند باعث به دردسر افتادن شما شود مخصوصا وقتی که تصمیم می گیرید تا بعد از چند ماه یک برزورسانی از برنامه تان را منتشر کنید سپس برنامه تان را راه اندازی می کنید و آن وقت است که ناگهان با یک کد گیج کننده و درهم و برهم مواجه می شوید.
RXJava کد و رویدادهای مورد نیازبرای مدیریت داده ها را ساده می کند اینگونه که به شما اجازه میدهد تا آنچه را که می خواهید بدست بیاورید را توصیف کنید، به جای اینکه یک لیست از دستورالعمل هایی بنویسید که برای کار کردن به آنها نیاز دارید. همچنین RXJava یک گردش کار استانداردی ارائه می دهد کخه می توانید برای رسیدگی و اداره ی تمام داده ها و رویدادهای برنامه از آن استفاده کنید. این رویکرد فرمولی کد را بسیار آسان و خوانا می کند.
آسان شدن چند رشته ای
برنامه های مدرن اندرویدی نیازمند این هستند که بتوانند همزمان چند کار را انجام بدهند. حداقل حداقل، کابران انتظار دارند که بتوانند تعامل خود با رابط گرافیکی برنامه تان را با برنامه حفط کنند در حالی که برنامه در حال انجام کاری دیگر در پس زمینه (مانند مدیریت اتصال شبکه ، دانلود یک فایل ، یا اجرای یک موزیک) است.. مشکل اینجاست که اندروید به طور پیش فرض تک رشته ای است، بنابراین اگر می خواهید برنامه ای داشته باشید که چندکار همزمان را موفقیت آمیز انجام دهد باید چند رشته ی اضافی ای را نیز بسازید.

در اصل ، اندروید چند روش برای ساخت رشته های اضافی ارائه می کند مانند services و Intentservices ولی هیچکدام از این ها راه حل ها برای پیاده سازی آسان نیست چون آنها به راحتی ممکن است که نتیجه ی پیچیده ای داشته باشند یا کد بسیار طولانی شود که این کار ممکن است باعث بوجود آمدن خطاها شود.

RXJava هدفش این است که زحمت ساخت برنامه های چند رشته ای را کم کند، با ارائه ی schedularها و operatorها ی مخصوص. اینها یک روش آسان پیش پای شما می گذارند برای تعریف و مشخص کردن رشته ای که باید کاری و اقدامی انجام دهد و رشته ای که نتایج این کار را باید post کند.  RXJavaبه طور پیش فرض شامل تعدادی schedular  است که در برگیرنده ی Schedulers.newThread هم هست که این برای ساخت یک رشته ی جدید مفید است.

برای تغییر جایی که رشته ای کاری انجام می دهد ، فقط نیازمند این هستید که جایی که یک observer ، به یک observable ، می رود توسط subscribe را ، تغییر دهید. آن هم با استفاده از عملگر subscribeon . برای مثال ما میخواهیم یک رشته ی جدید بسازیم و کاری که باید در این رشته انجام شود را به آن اختصاص دهیم :


1-observable.subscribeOn(Schedulers.newThread())

یک مشکل همیشگی دیگر چند رشتگی در اندروید این است که شما فقط از رشته اصلی می توانید رابط گرافیکی را بروز رسانی کنید. معمولا هر وقت که احتیاج به post کردن نتایج مربوط به کارهای پس زمینه به رابط گرافیکی برنامه دارید از مجبور هستید تا از Handler استفاده کنید.

مجددا RXJava یک راه حل آسان تری دارد . شما می توانید از عملگر observeon استفاده کنید برای تعریف observable ای که باید نوتیفیکیشن اش را توسط یک schedular متفاوت بفرستد. که اساسا باعث می شود شما قادر شوید تا داده های observable تان رابه رشته ای که انتخاب کرده اید (که رابط گرافیکی رشته ی اصلی هم می تواند شاملش شود) بفرستید.

این بدین معنی است که با دوخط کد زدن ، شما یک رشته ی جدید می سازید و نتایج کارانجام شده بر روی این رشته را به رشته ی اصلی که شامل رابط گرافیکی است می فرستید:


.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())

خب ، از نظر فنی ما یکم تقلب می کنیم اینجا ، چون AndroidSchedulers.mainThread فقط به عنوان بخشی از کتابخانه ی RXAndroid در اینجا در دسترس است ، که ما تا بخش سوم نگاهی به آن نخواهیم انداخت. ولی، این مثال به شما یک دید کلی می دهد نسبت به قدرتی که RXJava و RXAndroid دارند در حوزه ای که خیلی پیچیده به نظر می آید و توسط اینها ساده سازی شده است.
انعطاف پذیری افزایش یافته است
توجه کنید که obsevale ها داده هایشان را به شیوه ای منتشر می کنند که روشی که داده ها ساخته شده اند دیده نمی شود. به دلیل اینکه observer ها نمی توانند حتی ببینند که چگونه داده ها ساخته شده اند، شما برای پیاده سازی observable هایتان هرجا که بخواهید آزاد هستید.
همینکه شما observable هایتان را پیاده سازی کردید ، RXJava یک رده ی وسیعی از عملگرهایی که می توانید استفاده کنید برای فیلتر کردن ، ترکیب و انتقال داده های منتشر شده به وسیله ی obseravble ها را پیش پای شما می گذارد. شما حتی میتوانید تعداد بسیار زیادی از عکلگر ها را پشت سر یک دیگر و مرتبط یا هم درست کنید تا زمانی استریم های داده ی مورد نیاز برنامه ساخته شود.
برای مثال ، شما می توانید داده ها را از استریم های چندگانه با یک دگیر ترکیب کنید ، و سپس استریم جدید ترکیب شده را filter کنید. و به خاطر داشته باشید که در RXJava همه چیز به عنوان یک استریم داده ها تلقی می شود بنابراین شما حتی می توانید این عملگرها را به داده های غیرعادی مانند click events نیز اضافه کنید.
برنامه های واکنش پذیرتری بسازید
آن زمان گذشت که برنامه های می توانستند یک صفحه ی محتوا را بارگذاری کنند و منتظر کاربر می ماندند تا دکمه ی "بعدی" را بزند. امروزه، برنامه ی معمول حال حاضر احتیاج دارند تا قادر به واکنش نشان دادن به رویدادها و داده های مختلف و روزافزون آن هم به صورت بهنگام باشند. برای مثال برنامه ی شبکه ی اجتماعی معمولی شما احتیاج به این دارد تا قادر به listen کردن لایک ها ی ورودی ، کامنتها و درخواست های دوستی باشد در حالی که اتصال شبکه در پس زمینه مدیریت کند و سریع واکنش نشان دهد نسبت به لمس یا کشیدن صفحه توسط کاربر.
کتابخانه ی RXJava طراحی شده تا قادر باشد به طور همزمان و بهنگام یک رده ی وسیعی از داده ها و رویدادها را مدیریت کند و یک ابزار قدرتمند باشد برای برای ساخت برنامه های بسیار واکنش پذیر همانطور که کاربران موبایل انتظار دارند.
افزودن RXJava به اندروید استودیو
اگر شما معتقدید RXJava همان چیزی است که می خواهید و نیازهای شما را برآورده می کند، پس اولینقدم برای استاد شدن در RXJava افزودن کتابخانه ی آن به پروژه تان است.
یک پروژه ی در اندروید استودی بسازید با تنظیمات مورد نظرتان ، و فایل build.gradle را باز کنید و آخرین نسخه ی io.reactivex.rxjava2:rxjava را به عنوان یک dependency اضافه کنید.
در حال حاضر که مقاله نوشته می شود ، RXJava 2.0.5 آخرین نسخه منتشر شده است، بنابراین build.gradle من به شکل زیر است:

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
 
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
      exclude group: 'com.android.support', module: 'support-annotations'
  })
 
  compile 'com.android.support:appcompat-v7:25.1.0'
  testCompile 'junit:junit:4.12'
 
  compile 'io.reactivex.rxjava2:rxjava:2.0.5'
}

وقتی اوکی شد ، sync را بزنید.
مرحله بعد، فایل mainactivity را باز کنید و این import ها را که برای شروع کار با هسته ی RXJava احتیاج دارید را اضافه کنید :


import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

اگر در حال مهاجرت از RXJava 1 به 2 هستید، این import ها ممکن است همانطوری که انتظارش را دارید نباشد، چون در RXJava 1 یک پکیج با نام کاملا متفاوت داشتیم.
اما، این تغییر نام خودسرانه و دلخواهانه نبوده : پکیج های دارای نام متفاوت به شما این امکان را می دهد که در همین پروژه در کنار RXJava 1 بتوانید RXJava 2 هم بتوانید کار کنید.
اگر شما تا میانه های ساخت پروژه از RXJava 1 استفاده کرده اید پس الآن می توانید کتابخانه ی RXJava 2 را با ویژگی های آپدیت شده اضافه کنید و آنرا بلافاصله استفاده کنید، بدون اینکه هیچ قسمت RXJava 1 دچار مشکلی شود.
اگر کار با RXJava را با نسخه ی دوم آن آغاز می کنید ، پس باید آگاه باشید که اگر با هر آموزش RXJava ای یا کدی که از پکیجی با نام rx استفاده می کند مواجه شدید ، باید به یاد داشته باشید که این RXJava 1 است و متاسفانه از نسخه دوم پشتیبانی نمی کند.
ساخت بلوک های RXJava
تا بحال ، ما به صورت خیلی کلی یک نگاهی به RXJava داشتیم . مدتی طول می کشد تا دقیق تر و عمیق تر شویم. بیایید نگاهی به دو قسمت از مهم ترین قسمت های RXJava بیندازیم که البته آشنایی با آنها ممکن است کمی زمانبر شود :
در آخر این بخش ، نه فقط یک درک قوی از دو جز خواهیم داشت بلکه یک برنامه ی کاملا کاربردی دارای observable ساخته ایم که داده ها را منتشر می سازد و یک observer ای که به این انتشارها واکنش نشان می دهد.
ساخت یک observable
یک observable شبیه ساخت یک iterable است، در آن یک دنباله داده شده است و دنباله iterate خواهد شد و هر item را منتشر خواهد کرد ، گرچه observable ها معمولا انتشار داده ها را آغاز نمی کنند مگر اینکه یک observer داده ها را subscribe کند.
هر گاه یک observable یک آیتم را منتشر می کند، observer اش را با اسفاده از متد ()onNext آگاه می سازد.
همینکه یک observable همه ی مقادیرش رامنتقل کرد ، با یکی از متد های زیر پایان می پذیرد:
  • onComplete : هر گاه عملیات موفقیت آمیز باشد
  • oError : هرگاه یک استثنا بوجود بیاید فراخوانی می شود
بیایید یک نگاه به یک مثال بیندازیم . اینجا ما یک observable ای می سازیم که اعداد 1 تا 4 را منتشر می کند و سپس پایان می پذیرد.
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
  @Override
 
  public void subscribe(ObservableEmitter<Integer> e) throws Exception {
      //Use onNext to emit each item in the stream//
      e.onNext(1);
      e.onNext(2);
      e.onNext(3);
      e.onNext(4);
 
      //Once the Observable has emitted all items in the sequence, call onComplete//
      e.onComplete();
  }
 }
);

در اندروید استودیو Logcat Monitor را با زدن تب Android Monitor در پایین پنجره ی اندروید استودیو باز کنید( جایی که اشاره گر در اسکرین شات پایین قرار دارد ) و سپس تب Logcat را انتخاب کنید.




در ضمن برای تست کردن این کد هم از ابزار فیزیکی مورد استفاده تان و هم شبیه ساز اندروید استفاده کنید. همینکه برنامه بر روی صفحه ظاهر شد ، می توانید داده های منتشر شده توسط Observable را ببینید.


ساخت یک observable با کد کمتر
اگر چه پروژه ی شما با موفقیت در حال انتشار داده ها است ولی کدی که ما مورد استفاده قرار میدهیم چندان مختصر نیست مخصوصا کدی که با آن Observable مان را می سازیم.
خوشبختانه ، برای ساخت Observable آر ایکس جاوا تعدادی متد که باعث آسان شدن و خلاصه شدن می شوند را در اختیار ما می گذارد .
1- ()Observable.just
شما می توانید از اپراتور just. برای تبدیل هر آبجکت به یک Obsevable استفاده کنید. نتیجتا Observable آبجکت اصل را به صورت کامل منتشر خواهد کرد.
برای مثال ، اینجا ما یک Observable می سازیم که از همه ی Observer هایش یک String منتشر خواهد کرد :


Observable<String> observable = Observable.just("Hello World!");


2- ()Observable.from


عملگر  .from() باعث می شود که شما قادر باشید تا مجموعه ای از آبجکت ها را به یک استریم Observable  تبدیل کنید . شما همچنین می توانید یک آرایه را با استفاده از عملگر Observable.fromArray() به یک Observable  تبدیل کنید، یک callable  را می توانید به یک Observable تبدیل کنید با استفاده از Observable.fromCallable و یک Iterable را به یک Observable تبدیل کنید با استفاده از Observable.fromIterable 

3- ()Observable.range

شما می توانید از عملگر ()range. برای انتشار یک طیف از عدد صحیح متوالی استفاده کنید. اولین عدد صحیح اولین مقدار را ارائه می کند، و دومین عدد تعداد اعداد صحیحی است که می خواهید منتشر کنید. برای مثال :


Observable<Integer> observable = Observable.range(0, 5);

4- ()Observable.interval
این عملگر یک Observable می سازد که یک دنباله ی صعودی بی نهایت از اعداد صحیح را منتشر می کند ، که هر انتشار به وسیله ی یک فاصله ی زمانی جدا می شود. برای مثال:

Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS)

5- ()Observable.emty
عملگر ()empty یک Observer ای می سازد که هیچ آیتمی ندارد ولی معمولا برای موقعی می تواند مفید باشد  که نیاز به ساخت سریع یک Observable برای مصارف آزمایشی دارید.
نتیجه گیری
در این مقاله، ما ساخت بلوک های RXJava را پوشش دادیم.
تا اینجای کار ، شما یاد گرفتید که چگونه Observer و observable ها را بسازید و با آنها کار کنید، و این که چگونه subscription هایی بسازید که باعث شود observable های شما بتوانند داده ها را منتشر کنند. ما همچنین به صورت مختصر به چند تا از عملگرها نگاهی انداختیم  که آنها شما را قادر می سازد تا یک محدوده و رنجی از Observable های متفاوت بسازید که باز هم در عین حال کد کمتری  استفاده واقع شده.
اما، عملگرها فقط یک راه مفید برای کاهش مقدار کدی که نیاز به نوشتن است نیست!
ساخت یک Observable و یک Observer به اندازه ی کافی ساده است، ولی عملگرها جایی هستند که شما شروع به مشاهده این می کنید که واقعا چه چیزهایی و چه کارهایی در RXJava می شود انجام داد.
بنابراین در پست بعدی (اگر خدا بخواهد) من قوی ترین عملگرهای RXJava را مورد بررسی قرار خواهم داد ، که شامل عملگرهایی است که می توانند تجربه ی چند رشتگی(مالتی تردینگ) آسان در اندروید را به شما بدهند. همراه ما باشید تا قدرت واقعی کتابخانه ی RXJava را بیاموزید.

نظرات (۱)

  1. یونس
    سلام اقا زیاد زحمت کشیدید .اگر بشه فقط متد ها رو ردیف کنید فقط بگید کارش چیه و نه نمونه بزنید عالی میشه .این بدرد ما میخوره .
    • ۱۲ آذر ۹۶، ۱۷:۵۳
      سلام باشه در اسرع وقت همین کارو انجام میدم

ارسال نظر

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

تصاوير منتخب