Android daha çox Rx etmək üçün necə - 5 göstərişlər

RxJava-nı gündəlik işinizdə istifadə edirsinizsə, bir gün çox istədiyiniz nöqtəyə çatacaqsınız ... RxJava-nı hər yerə yerləşdirin! Sizə 5 praktik məsləhət verim.

RxJava-nı hər yerdə istifadə etmək (ümumiyyətlə) pis bir fikir deyil. "Hey, bunu for-loop / Handler / Async Task / bəzi başqa çirkin bir həll əvəzinə RxJava axınına qoya bilərsəm, daha sərin görünür" deyə düşünmək normaldır. Bəli, sərin olacaq. Mən yalnız bacarsaydım ...

Yaxşı, sizin üçün yaxşı bir xəbərim var - RxJava, xəyal etdiyiniz şeylərin çoxunu etməyə imkan verir! Layihələrimdə çox istifadə etdiyim şeylər barədə sizə 5 tövsiyəmi verim. Bu kod parçaları həm RxJava, həm də RxJava2 üzərində işləyir. Bu məqalədə RxJava haqqında təməl bir anlayışınız olduğu düşünülür. Əks təqdirdə, əvvəlcə başqa məqalələri oxumağınızı məsləhət görürəm (bu RxJava-da - istehsal xətti - başlamaq üçün əla bir yerdir).

# 1 cüt klik aşkarlama

Tətbiqinizdə bir neçə düymə var və bu düymələrin iki dəfə vurulub-vurulmadığını görmək istəyirsiniz. Asan deyilmi? Bəli, yalnız bir sayğac yaratmaq, hər vuruşu yoxlamaq, sayğacı tədricən yuxarı qaldırmaq və sonra sayğacı yenidən qurmağı unutmayın. Bunu etmək üçün mütləq daha təmiz bir yol olması lazım deyil. Əlbətdə, budur:

özəl PublishSubject eventSubject = PublishSubject.create ();
public static final int TIME_BETWEEN_EVENTS_MILLIS = 500; public static final int NUMBER_OF_EVENTS = 2;
public DoubleClick () {eventSubject .buffer (eventSubject.debounce (TIME_BETWEEN_EVENTS_MILLIS, TimeUnit.MILLISECONDS)) .filter (events -> events.size () == NUMBER_OF_EVENTS) .ubune (events -> doSomething ();
button.setOnClickListener ((button) -> eventSubject.onNext (true)); }

PublishSubject ilə öz məqalələrimizi çıxara və tuta bilərik. Tutulduqdan sonra hadisə sayının istədiyiniz dəyərə uyğun gəldiyini yoxlayırıq. Əlbətdə ki, bunu hər hansı bir hadisə ilə edə bilərsiniz - TextView-dən biraz mətn almaq, başqa bir görünüşdən kliklər almaq və ya başqa bir şey.

# 2 Hər 10 dəqiqədən bir API-yə müraciətləri təkrarlayın

Operatorun təkrar istifadə etməsi Gecikmə nəticələri ilə birlikdə abunəliyimizin bir müddət sonra təxirə salınmasına səbəb ola bilər. Hər hansı bir səbəbdən API-dən hər 10 dəqiqədən bir yeni məlumatlar tələb etmək istəyirsinizsə, bunu RxJava ilə yalnız bir sətirdə edə bilərsiniz:

sourceObservable.repeatWhen (tamamlandı -> bitdi. gecikmə (10, TimeUnit.MINUTES));

Unutmayın, Gözlənilən yalnız əvvəlki tamamlandıqda təkrarlanacaq.

# 3 İki asılı obyekti birləşdirin

Tutaq ki, API-dən pişik alırıq və hər pişik üçün bir neçə oyuncaq (pişikdən asılı olan) almaq istəyirik. Bundan sonra bir obyekti CatAndToys ilə birləşdirmək istəyirik. Bu, FlatMap-ın ikinci parametri vasitəsilə RxJava ilə mümkündür (tez-tez istifadə olunmur)

[...] Mənbədən müşahidə olunan elementləri bu qaynaq elementləri tərəfindən tetiklenen müşahidə edilə bilən ilə birləşdirir və bu birləşmələri göndərir.

Mənbə: RxJava sənədləri

Kodun özü üçün danışmasına icazə verin:

Müşahidə oluna bilər catWithToysObservable = getCatObservable () .flatMap ((cat) -> getToysForCatObservable (cat), (cat, toy) -> yeni CatWithToys (cat, toy));

FlatMap-dəki bu ilk parametrin Cat'ı ​​bir parametr olaraq götürdüyünü və Oyuncaqları qaytardığını görürük. Sonra ikinci parametr Cat və Toys (ilk funksiyanın nəticəsi) alır və CatWithToys obyektini qaytarır. Bu, iç içə yerləşdirilmiş flatMap operatorlarından istifadə etmədən bir çox asılı istəkləri API-yə birləşdirməyə imkan verir.

# 4 səhifə fasiləsi istəyin

API-nin bəzi obyektlərinə baxmaq istəyirsinizsə, bunu RxJava istifadə edərək asanlıqla edə bilərsiniz. Hiylə bir son nöqtəyə çatana qədər bütün səhifələri birləşdirməkdir (məsələn, son tələb boş nəticələr verir və ya elementlərin sayı düzgün və düzgündür). Kodu nəzərdən keçirək:

ictimai müşahidə edilə bilər > getAllUsers () {return getUsersObservable (null); }
xüsusi müşahidə edilə bilər > getUsersObservable (last string lastUserId) {return apiAdapter .getData (lastUserId) .filter (userList ->! isLastPage (userList)) .flatMap (this :: getNextPageUsersObservable); }
xüsusi müşahidə edilə bilər > getNextPageUsersObservable (son Siyahı userList) {Müşahidə oluna bilər > usersPageObservable = Observable.just (userList);
int lastUserId = getLastUserId (userList); Müşahidə oluna bilər > nextUsersPageObservable = getUsersObservable (lastUserId);
return Observable.merge (nextUsersPageObservable, usersPageObservable); }
xüsusi boolean isLastPage (son siyahı userList) {return userList.isEmpty (); }

Əvvəlcə parametrləri olmayan tək bir səhifə tələb edirik (və ya API-yə görə buraya 0 daxil edə bilərsiniz). Sonra son siyahı vəziyyətimizi yoxlayırıq. Sona çatmamışıqsa, son sorğudan parametrlə bəzi Yeni Səhifələr tələb edəcəyik (istifadəçinin son kimliyi, ya da son fotonun tarixi və ya başqa bir şey ola bilər) və bunu əvvəlki müşahidə olunanları birləşdirin. Siyahının sonuna düşsək, işimiz bitəcək.

# 5 Yüngül RxBus

Layihənizdə bir hadisə avtobusu istifadə edirsinizsə (Otto, Greenrobot'un hadisə avtobusu və ya başqa bir şey olsun), öz hadisə avtobusunuzu tətbiq etmək istəyə bilərsiniz - RxBus! Bəlkə başqası tərəfindən hazırlanan bir şeydən istifadə etmək əvəzinə təkəri yenidən kəşf etdiyimizi düşünürsən?

İndi RxJava istifadə edərək öz EventBus'unuzu tətbiq etməyin nə qədər asan olduğunu gördükdə, bunu daxili kitabxana kimi əlavə edə bilərsiniz. Xarici kitabxanadakı dəyişikliklərdən asılı deyilsiniz, buna görə RxBus-u ehtiyaclarınıza uyğunlaşdıra bilərsiniz və - layihədə artıq RxJava varsa - niyə başqa bir şey üçün istifadə etmirsiniz?

public class RxBus {private static last RxBus instance = new RxBus (); xüsusi son mövzu rxBus;
ictimai RxBus () {PublishSubject rxEventPublishSubject = PublishSubject.create (); rxBus = rxEventPublishSubject.toSerialized (); }
public statik RxBus getInstance () {return instansiyası; }
ictimai müşahidə edilə bilər getRxBus () {return rxBus; }
ictimai boş poçt (final RxEvent rxEvent) {rxBus.onNext (rxEvent); }
ümumi sinif RxEvent {}}

RxBus-un əsas nüvəsi SerializedSubject-dir (ikiqat klikləri aşkarlamaq üçün istifadə etdiyimiz PublishSubject-ə çox oxşayırıq, amma bu mövzu təhlükəsizdir). Sadəcə bu SerializedSubject-ə istinad edən bir singleton sinfi yaradırıq. Bir hadisə göndərdiyimiz zaman, SerializedSubject ilə elementlər göndəririk. Tədbirə abunə olduğumuz zaman SerializedSubject-dən hadisələr qəbul etməyə abunə oluruq. Asan deyilmi? RxBus'umuzu müxtəlif mövzulardan istifadə etmək istədiyimiz üçün toSerialized () metodundan istifadə edirik.

Nəticə

Gördüyünüz kimi, RxJava ilə çox şey edə bilərsiniz. Bu tətbiqinizdəki baxışlar, məlumat istəkləri və daxili rabitə üçün faydalıdır. Unutmayın, təqdim etdiyim problemlərin bir çox həlli var və RxJava həmişə ən yaxşısı olmaya bilər, amma inşallah bu tövsiyələr problemlərinizə başqa həll yolları axtarmağa ilham verdi.

Bu belədir! Ümid edirəm məsləhətlərimi bəyənəcəksiniz. Daha çox məlumat üçün bizi izləyin!