|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "RxAndroid" |
| 4 | +date: 2019-05-27 |
| 5 | +categories: ["Biblioteki"] |
| 6 | +image: libraries/rxandroid |
| 7 | +github: libraries/tree/master/rxandroid |
| 8 | +description: "Biblioteki" |
| 9 | +version: RxAndroid 2.1, RxJava 2.2 |
| 10 | +keywords: "reaktywne, reactive, rxandroid, rxjava, reactivex, obserwator, obserwowany, observer, observable, schedulers, operator, disposable, subscribe, async, thread, java, android, programowanie, programming" |
| 11 | +--- |
| 12 | + |
| 13 | +## Programowanie reaktywne |
| 14 | +`Programowanie reaktywne` (`reactive programming`) jest paradygmatem programowania asynchronicznego zorientowanym na przepływ danych w postaci strumieni i propagacje zmian w formie zdarzeń. Strumieniem danych może być prawie wszystko, np. zmiana wartości obiektu, zdarzenia interfejsu użytkownika, zapytania sieciowe, operacje na danych czy błędy, a każde zadanie może być wykonywane na własnym wątku. Sposób działania opiera się na `wzorcu Obserwator`, tzn. strumienie mogą emitować wartości i być obserwowane. Realizacją programowania reaktywnego dla `Android` jest moduł `RxAndroid` rozszerzający bibliotekę `RxJava` (implementacja `ReactiveX` dla `Java VM`) o harmonogramy (`Schedulers`) wspierające wielowątkowość w środowisku Android. `RxJava` upraszcza zarządzanie asynchronicznymi i współbieżnymi operacjami, ułatwia komunikacje zadań w tle z wątkiem głównym, pozwala na wczesne wykrycie błędów i zmniejsza zapotrzebowanie na zmienne stanu. |
| 15 | + |
| 16 | +## Wzorzec |
| 17 | +Zadaniem wzorca `Obserwator` jest realizacja mechanizmu komunikacji między obiektami zależnymi poprzez powiadamianie obiektów subskrybentów o zmianie stanu obiektu obserwowanego czy statusie operacji. Obiekt może być obserwowany (`Observable`) przez wielu obserwatorów (`Observer`) i sam może być obserwatorem innych obiektów. Obiekt obserwowany emituje zdarzenia, które trafiają do obserwatorów, a następnie są przez nich przetwarzane. |
| 18 | + |
| 19 | +## Harmonogramy |
| 20 | +Wprowadzone w module `RxAndroid` harmonogramy decydują o tym na jakim wątku obiekt obserwowany będzie wykonywał zadanie oraz na jakim wątku obiekt obserwatora będzie odbierał i przetwarzał wyemitowane dane. Najpopularniejszymi harmonogrami są: `AndroidSchedulers.mainThread` - odpowiada za główny wątek aplikacji, `Schedulers.io` - wykorzystywany w nie wymagających operacjach i `Schedulers.computation` - przeznaczony do przetwarzania intensywnych zadań. Wyróżnia się także `Schedulers.newThread`, `Schedulers.single`, `Schedulers.immediate`, `Schedulers.trampoline`, `Schedulers.from`, które różnią się synchronicznością, kolejnością, czasem rozpoczęcia i ilością przetwarzanych zadań. Przypisanie harmonogramu dokonywane jest na obiekcie obserwowanym za pomocą metod `subscribeOn` i `observeOn`. |
| 21 | + |
| 22 | +//TODO example with register schedulers on Observable |
| 23 | + |
| 24 | +## Obserwator |
| 25 | +Obiekt obserwatora dokonuje subskrybcji obiektu obserwowanego za pomocą metody `subscribe` wywołanej na obiekcie obserwowanym oraz implementuje metody `onSubscribe`, `onNext`, `onError`, `onComplete` interfejsu `Observer` w celu podjęcia działania w odpowiedzi na stan i emisje obiektu obserwowanego. |
| 26 | + |
| 27 | +//TODO example with Observer interface implementation |
| 28 | + |
| 29 | +## Obserwowany |
| 30 | +Obiekt obserwowany w `RxJava` jest strumieniem danych wykonującym operacje i emitującym dane. Podstawowym typem obiektu obserwowanego jest `Observable` - emituje dowolną ilość elementów i kończy się sukcesem lub zdarzeniem błędu. Wyróżnia się również także: `Flowable` - rozszerza `Observable` o wsparcie dla `backpressure` (zarządzanie czasem emitowania i konsumowania zdarzenia), `Single` - emituje jedno zdarzenie lub błąd, `Maybe` - może emitować jedno zdarzenie lub błąd, `Completable` - nie emituje zdarzenia, kończy się sukcesem lub błędem. Obiekt obserwowany może być tworzony za pomocą kilku operatorów jak np.: `create`, `just`, `defer`, `from`, `interval`, `range`, `repeat`, `timer`, które różnią się sposobem definicji, momentem, częstotliwością i zwracanym typem danych emisji. |
| 31 | + |
| 32 | +//TODO example with Observable created with: create (custom type), just, from |
| 33 | + |
| 34 | +## Uchwyt |
| 35 | +W celu uniknięcia wycieków pamięci związanych z niepożądaną dłużej subskrypcją obserwatora należy przypisać referencje `Disposable` z poziomu obserwatora oraz wypisać go z subskrypcji. |
| 36 | + |
| 37 | +//TODO example |
| 38 | + |
| 39 | +W przypadku wielu obserwatorów manualne niszczenie subskrypcji może być żmudne i podatne błędy dlatego w takiej sytuacji warto użyć `CompositeDisposable`, który utrzymuje listę subskrypcji obiektów `DisposableObserver` w puli i potrafi zlikwidować je wszystkie naraz. |
| 40 | + |
| 41 | +//TODO example |
| 42 | + |
| 43 | +## Operatory |
| 44 | +Operatory pozwalają na manipulacje i modyfikacje emitowanych danych za pomocą zadań transformacji, filtrowania, łączenia, agregacji czy tworzenia. RxJava dostarcza szeroki zbiór operatorów podzielonych na kategorie w zależności od rodzaju operacji, a ich łączenie umożliwia uzyskanie dowolnego złożonego strumienia danych. Poza operatorami odpowiedzialnymi za tworzenie obiektów obserwowanych (`create`, `just`, `from` itp) do często wykorzystywanych należą m.in. `filter`, `map`, `skip`, `take`, `concat`. |
| 45 | + |
| 46 | +//TODO example |
| 47 | + |
| 48 | +## Przykład |
| 49 | + |
| 50 | +//TODO example |
0 commit comments