RxJava چیست

RXjava پیاده سازی جاوا برای برنامه نویسی reactive (برنامه نویسی واکنشی) است که به زبان ساده به این معنی است که یک قسمت از کد شما یک رویداد را مشخص می کند (با یک کلیک دکمه ، پاسخ api موفق و غیره) در حالی که قسمت دیگری از کد، کد قبل را مشاهده می کند و به آن رویداد خاص به طور نا همگام واکنش نشان می دهد. (به روزرسانی ویو ، مدیریت نتیجه api و غیره).

برنامه نویسی reactive یا واکنشی چیست؟

برنامه نویسی واکنشی اساساً یک برنامه ناهمگام مبتنی بر رویداد است. هر آنچه می بینید یک جریان داده ناهمگام است ، که می تواند مشاهده شود و هنگامی که مقادیری از آن ساطع می شود عملی انجام می شود. می توانید از هر چیزی جریان داده ایجاد کنید. تغییرات متغیر ، کلیک روی رویدادها ، تماسهای http ، ذخیره داده ، خطاها و غیره. وقتی می گوید نا همگام ، این بدان معناست که هر ماژول کد بر روی رشته خود اجرا می شود بنابراین چندین بلوک کد را با هم اجرا می کند.

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

یک مثال ساده می تواند x = y + z باشد. که در آن جمع y و z به x اختصاص داده شده است. در برنامه نویسی واکنشی ، هنگامی که مقدار y تغییر می کند ، مقدار x بدون اجرای مجدد دستور x    y + z= به طور خودکار به روز می شود. با مشاهده مقدار y یا z می توان به این مهم دست یافت.

هنگامی که برنامه خود را در Reactive Programming شروع می کنید ، نحوه طراحی معماری و نحوه نوشتن کد به طور کامل تغییر می کند. حتی اگر با Clean Architecture ، MVP ،  MVVM و سایر کتابخانه ها نیز روبرو شوید ، برنامه نویسی واکنشی با قدرت بیشتری ظاهر می شود.

افزونه های واکنشی یا  Reactive Extensions

(Reactive Extensions (ReactiveX – RX کتابخانه ای است که از اصول برنامه نویسی reactive ( ویکی پدیا ) پیروی می کند. یعنی با استفاده از توالی observable، برنامه های ناهمگام و مبتنی بر رویداد را می سازد. این کتابخانه ها مجموعه ای از رابط ها و متد ها را ارائه می دهند که به توسعه دهندگان کمک می کند کدی ساده و تمیز بنویسند.

برنامه های افزودنی واکنشی به چندین زبان (C ++ (RxCpp) ، C # (Rx.NET) ،  java(RxJava) ، Kotlin (RxKotlin) ، Swift (RxSwift و موارد دیگر در دسترس هستند. در این مقاله به طور خاص به RxJava و RxAndroid می پردازیم زیرا اندروید نقطه متمرکز مقاله ما است.

RxAndroid  چیست؟

RxAndroid  مخصوص پلتفرم اندروید است که تعدادی کلاس را در بالای RxJava اضافه کرده است. scheduler ها در ()RxAndroid معرفی می شوند که نقش اصلی را در پشتیبانی از مفهوم چند رشته ای در برنامه های اندروید ایفا می کنند.  البته همه مواردی که استفاده می کنیم فقط از کتابخانه RxJava است.

در واقع Rxandroid همان Rxjava است با تعدادی کد اضافه که زمانبند ها نیز جزء کد های اضافه شده به Rxjava توسط Rxandroid است. در رابطه با زمانبند ها یا scheduler ها در ادامه توضیح داده ایم.

پس گفتیم که RxJava پیاده سازی جاوا از Reactive Extension است. در واقع کتابخانه ای است که با پیروی از الگوی Observer رویداد هایی ناهمزمان را تشکیل می دهد. شما می توانید جریان داده های ناهمزمان را روی هر رشته یا thread ایجاد کنید ، داده ها را تغییر داده و توسط یک observer بر روی هر رشته اعمال کنید. این کتابخانه طیف گسترده ای از عملگرهای شگفت انگیز مانند نقشه ، ترکیب یا combine، ادغام یا merge، فیلتر و موارد دیگر را که می توان روی جریان داده اعمال کرد ، ارائه می دهد.

قابلیت های rxjava

در RxJava  همه چیز در مورد دو مؤلفه اصلی است: observable و observer. اما علاوه بر این دو، موارد دیگری نیز مانند Subscription ، اپراتورها و Scheduler ها نیز وجود دارد.

 قابل مشاهده بودن یا Observable

اگر به یاد داشته باشید بالاتر گفتیم که RxJava یک برنامه نویسی مبتنی بر رویداد یا Event است بنابراین observable بخشی از کد است که رویداد را مشخص می کند. برای رویدادهای مناسب باید به observable دقت کنیم.

در واقع observable نوعی داده است که مقداری کار می کند و داده منتشر می کند.

 مشاهده کننده یا observer

بخشی از کد است که به رویداد مشخص شده توسط Observable دقت می کند و به آن واکنش نشان می دهد. در واقع Observer قسمت مقابل observable است و داده های ساطع شده توسط Observable را دریافت می کند.

()onSubscribe : هنگامی که یک Observer در Observable اشتراک پیدا می کند، این متد فراخوانی می شود.

()onNext : هنگامی که Observable شروع به انتشار اطلاعات می کند ، این متد فراخوانی می شود.

()onError :در صورت بروز هرگونه خطا ، این متد فراخوانی می شود.

()onComplete : هنگامی که یک Observable انتشار همه موارد را به پایان می رساند ، این متد فراخوانی می شود.

 اشتراک یا Subscription

پیوند بین Observable و Observer به عنوان اشتراک نامیده می شود. می تواند چندین observable مشترک در یک observer مشاهده شود.

 اپراتور / تحول یا Operator / Transformation

اپراتورها قبل از دریافت observer ، داده های منتشر شده توسط Observable را اصلاح می کنند.

 زمانبندی ها یا Scheduler ها

Scheduler ها موضوعی را تعیین می کنند که Observable باید داده ها را بر روی آن منتشر کند و Observer باید داده ها را دریافت کند. به عنوان مثال پس زمینه ، رشته اصلی و غیره.

مثال عملی از کدنویسی rxjava

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

به سراغ انجام مثالی از Rxjava برویم.

افزودن وابستگی ها

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

// RxJava

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



// RxAndroid

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

 

مراحل اساسی

1) یک Observable ایجاد کنید که داده را ساطع کند. در زیر ما یک Observable ایجاد کرده ایم که لیستی از نام حیوانات را منتشر می کند. در اینجا فقط از عملگر () برای انتشار چند نام حیوان استفاده می شود.

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

 

2) یک Observer ایجاد کنید که به Observable دقت کند و واکنش نشان دهد. Observer روش های رابط زیر را برای آگاهی از وضعیت observable ارائه می دهد.

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!");

            }

        };

    }

 

3) Observer را در Observable مشترک کنید تا بتواند شروع به دریافت اطلاعات کند. در اینجا ، می توانید دو متد دیگر را نیز فرا بگیرید :  ObservOn () و subscribeOn ()

( ()subscribeOn(Schedulers.io : این امر به Observable می گوید که وظیفه را روی یک موضوع پس زمینه اجرا کند.

( ()observeOn (AndroidSchedulers.mainThread : این متد به observer می گوید که داده ها را در موضوع UI اندروید دریافت کند تا بتوانید اقدامات مربوط به رابط کاربر را انجام دهید.

animalsObservable

        .subscribeOn(Schedulers.io())

        .observeOn(AndroidSchedulers.mainThread())

        .subscribe(animalsObserver);

 

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

onSubscribe

Name: Ant

Name: Bee

Name: Cat

Name: Dog

Name: Fox

All items are emitted!

در اینجا کد کامل مثال بالا آورده شده است. activity را اجرا کرده و خروجی را در 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("Ant", "Bee", "Cat", "Dog", "Fox");

    }

}