شروع RxAndroid
از سری مقالات آموزش اندروید, مبحث RxAndroid را برمیگزینیم.
در مقالات قبل پیرامون Reactive و همینطور RxJava توضیحاتی داده شد. از این پس سعی میشود تا در مقالات مرتبط با جاوا و اندروید از RxJava بیشتر استفاده شود تا به این مبحث اشراف کامل پیدا کنید. RxAndroid حداقل کلاس های RxJava برای برنامه نویسی Reactive را در خود دارد تا استفاده از آن آسان تر شود.
عمدتا برنامه نویسان اندروید با چالش Background Process مواجه هستند. برای مثال وقتی به یک API متصل میشوید و اطلاعاتی را دریافت میکنید, نیاز است تا بعد از دریافت مقادیر مورد نیاز, َUser Interface را نیز بروزرسانی کنید. همانطور که میدانید پردازش ها و جابجایی های اطلاعات در بستر شبکه نمیتواند در Main Thread قرار بگیرد. بنابراین باید این پردازش را به عنوان یک Background Process در یک AsyncTask قرار دهید.
AsyncTask یک ابزار پیش فرض برای چنین پردازش هایی است. متد doInBackground پردازش را در Background انجام میدهد و با استفاده از متد onPostExecute نتیجه را میتوان به UI Thread ارسال کرد. یکی از معضلات AsyncTask این است که اگر خطایی در Background Process رخ دهد از طریق try / catch کنترل میشود.میتوان با استفاده از متد هایی, پیروزی یا شکست یک پردازش را کنترل کرد اما نیاز است تا هربار, برای هر پروژه این متد ها را کد نویسی کنید.
کاستی بعدی AsyncTask در Rotation نمایان میشود. وقتی یک کاربر دستگاه را Rotate میکند, Background process های این activity نیز نیاز است تا مجددا فراخوانی شوند. علت این امر این است که وقتی rotate انجام میشود, Activity به حالت destroy رفته و restart میشود. وقتی AsyncTask Instance به Activity متصل میشود, با خطا از برنامه خارج میشود.
در کنار این چالش ها, فرض کنید ارتباط با Server به صورتی باشد که هر درخواست به نتیجه در خواست های قبلی مرتبط باشد. و یا در حالت معمول تر, بخواهیم چند پردازش را موازی (Parallel) پیش ببریم و نتیجه این پردازش ها را ترکیب و در User Interface استفاده کنیم. در چنین پردازش هایی, AsyncTask نمیتواند کمکی به ما کند.
اما با استفاده از RxJava میتوان این مشکلات را حل کرد. Reactive Programming به این معنا است که با تغییر مقادیر متغیر ها, واکنشی رخ دهد. برای مثال یک جدول در Excel را در نظربگیرید. یک جدول با سه سطر و دو ستون ایجاد میکنیم. ستون اول نام مقادیر و ستون دوم مقدار مقادیر را شامل میشود. برای سطر متغیر اول, نام X و مقدار ۱۰ را در نظر میگیریم. برای سطر دوم, نام متغیر را Y و مقدار آن را ۲۰ در نظر میگیریم. متغیر سوم را با نام Result تعریف میکنیم و مقدار آن را با استفاده از فرمول, X+Y قرار میدهیم. به این ترتیب هرگاه مقادیر X و یا Y تغییر کند, مقدار Result نیز تغییر میکند. این مثال تا حدودی نزدیک به فرآیند هایی است که در Reactive Programming انجام میشوند.
در مقالات قبل, توضیحاتی پیرامون RxJava داده شد, اما در این مقاله به صورت گذرا, مفاهیم تعریف شده را مرور میکنیم. در RxJava و RxAndroid دو مبحث مهم Observable و Observer وجود دارد. وقتی یک Observable تغییر کند, تمام Observer هایی که به آن اختصاص یافته اند نیز تغییر میکنند. عمل اختصاص یافتن با استفاده از متد subscribe در Observable انجام میشود. Observer سه حالت دارد که توسط Observable مورد استفاده قرار میگیرد. متد onNext یک مقدار جدید را به Observer اختصاص میدهد. متد onComplete وقتی فراخوانی میشود که اختصاص اطلاعات از Observable به Observer به اتمام برسد. متد onError نیز وقتی فراخوانی میشود که Observable با خطا مواجه شود و توسط این متد Observer را آگاه میسازد. از کارکرد متد های موجود در RxJava میتوان به این نتیجه رسید که تمام تمرکز بر داده ها و تغییرات آنها است.
برای افزودن RxAndroid نیاز است تا Gradle Dependency های مورد نیاز را به پروژه اضافه کنیم.
compile "io.reactivex.rxjava2:rxjava:2.0.5" compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
یک RecyclerView, EditText و Button را درون یک Activity قرار میدهیم و میخواهیم با استفاده از RxAndroid با هر کلیک مقدار موجود در EditText به لیست اضافه شود. برای تعریف این View ها از Butterknife استفاده میکنیم. توجه داشته باشید که در این مقاله تنها به معرفی RxAndroid میپردازیم و هدف از این مثال آشنایی با ساختار آن است. در مقالات بعدی مباحث دریافت اطلاعات در بستر شبکه را مورد بررسی قرار میدهیم.
@RequiresApi(api = Build.VERSION_CODES.N) @OnClick(R.id.add) public void addName() { names.add(name.getText().toString()); sortNames(); } @RequiresApi(api = Build.VERSION_CODES.N) private void sortNames() { listAdapter.clear(); names.sort(String::compareTo); Observable<List<String>> sortedList = Observable.just(names); sortedList.subscribe(name -> name.forEach(this::addList), error -> Log.e("List Error", error.getMessage()), System.out::println); } private void addList(String name) { listAdapter.add(name); }
همانطور که در متد sortName مشاهده میکنید, با استفاده از Lambda ابتدا عناصر درون لیست را مرتب میکنیم. سپس یک Observable را تعریف میکنیم و عناصر لیست را به عنوان Observer به آن میدهیم. متد Subscribe سه متغیر دارد که متغیر اول متد onNext, متغیر دوم متد onError و متغیر سوم, متد onComplete است که با استفاده از lambda نوشته شده است.
در مقاله بعد به استفاده از RxAndroid در Retrofit میپردازیم.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.