You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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
19
## Obserwator
25
20
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
21
27
-
//TODO example with Observer interface implementation
22
+
{% highlight java %}
23
+
private Observer<String> createObserver() {
24
+
Observer<String> observer = new Observer<String>() {
25
+
@Override
26
+
public void onSubscribe(Disposable d) {
27
+
//Observer subscribe to Observable
28
+
}
29
+
30
+
@Override
31
+
public void onNext(String s) {
32
+
//Observer received some data stream
33
+
}
34
+
35
+
@Override
36
+
public void onError(Throwable e) {
37
+
//Observer received emitted error
38
+
}
39
+
40
+
@Override
41
+
public void onComplete() {
42
+
//Observer completed receiving data from Observable
43
+
}
44
+
};
45
+
return observer;
46
+
}
47
+
{% endhighlight %}
28
48
29
49
## 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.
50
+
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, czasem, częstotliwością i zwracanym typem danych emisji.
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
70
+
//emit all data one by one
71
+
for(String item : data) {
72
+
if(!emitter.isDisposed()) {
73
+
emitter.onNext(item);
74
+
}
75
+
}
76
+
//emit completed event
77
+
if(!emitter.isDisposed()) {
78
+
emitter.onComplete();
79
+
}
80
+
}
81
+
});
82
+
return observable;
83
+
}
84
+
85
+
private List<String> prepareData() {
86
+
List<String> data = new ArrayList<>();
87
+
data.add("Catan");
88
+
data.add("Splendor");
89
+
data.add("7 Wonders");
90
+
data.add("Codenames");
91
+
data.add("Taboo");
92
+
return data;
93
+
}
94
+
{% endhighlight %}
36
95
37
-
//TODO example
96
+
## Harmonogramy
97
+
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`.
38
98
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.
.observeOn(Schedulers.io()) //emit data on background thread
108
+
.subscribeOn(AndroidSchedulers.mainThread()) //receive data on UI thread
109
+
.subscribe(observer); //subscribe observer to observable
110
+
}
111
+
{% endhighlight %}
42
112
43
113
## Operatory
44
114
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`.
.filter(new Predicate<String>() { //emit only some elements
124
+
@Override
125
+
public boolean test(String s) throws Exception {
126
+
return s.toLowerCase().startsWith("c");
127
+
}
128
+
})
129
+
.map(new Function<String, Object>() { //modify data
130
+
@Override
131
+
public Object apply(String s) {
132
+
return s.toUpperCase();
133
+
}
134
+
})
135
+
.subscribe(observer);
136
+
}
137
+
138
+
## Uchwyt
139
+
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.
140
+
141
+
{% highlight java %}
142
+
public class SingleObserverActivity extends AppCompatActivity {
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.
49
192
50
-
//TODO example
193
+
{% highlight java %}
194
+
public class MultipleObserversActivity extends AppCompatActivity {
195
+
196
+
private CompositeDisposable compositeDisposable = new CompositeDisposable();
0 commit comments