RxJava Subject — Publish, Replay, Behavior and Async Subject
Bài đăng này đã không được cập nhật trong 4 năm
RxJava Subject — Publish, Replay, Behavior and Async Subject
Sau đây, chúng ta sẽ tìm hiểu về các Subject có sẵn trong RxJava:
- Publish Subject
- Replay Subject
- Behavior Subject
- Async Subject
Vậy Subject là gì?
A Subject is a sort of bridge or proxy that is available in some implementations of ReactiveX that acts both as an observer and as an Observable. Because it is an observer, it can subscribe to one or more Observables, and because it is an Observable, it can pass through the items it observes by re-emitting them, and it can also emit new items.
-
Giả sử professor là một Observable. Professor dạy về một vài topic.
-
Giả sử student là một Observer. Student quan sát topic mà professor đang dạy.
Publish Subject
Nó emits tất cả subsequent items của nguồn Observable tại thời điểm subscription.
Ở đây, nếu một student đã vào lớp muộn, nó chỉ muốn nghe từ thời điểm nó vào lớp, thì Publish sẽ là lựa chọn tốt nhất trong trường hợp này.
Ví dụ:
PublishSubject<Integer> source = PublishSubject.create();
// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
Replay Subject
Nó emits tất cả subsequent items của nguồn Observable, mặt cho subscriber subscribe khi nào.
Ở đây, nếu student đã vào lớp muộn, nó muốn nghe lại tất cả từ khi bắt đầu thì chúng ta sẽ sử dụng Replay.
Ví dụ:
ReplaySubject<Integer> source = ReplaySubject.create();
// It will get 1, 2, 3, 4
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();
// It will also get 1, 2, 3, 4 as we have used replay Subject
source.subscribe(getSecondObserver());
Behavior Subject
Nó emits item gần nhất được emited và tất cả subsequent items của nguồn Observable khi một observer subcribes đến nó.
Ở đây, nếu student đã vào lớp muộn, nhưng muốn nghe những gì gần nhất (Không phải từ lúc bắt đầu) professor đang dạy, để student có thể nắm được idea của ngữ cảnh. Trong trường hợp này chúng ta sẽ sử dụng Behavior.
Ví dụ:
BehaviorSubject<Integer> source = BehaviorSubject.create();
// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will get 3(last emitted)and 4(subsequent item) and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
Async Subject
Nó chỉ emits giá trị cuối cùng của source Observable (chỉ giá trị cuối cùng).
Bây giờ, nếu student vào lớp bất kì lúc nào, và chỉ muốn nghe những thứ cuối cùng, sau khi lớp kết thúc thì Async sẽ là lựa chọn của chúng ta.
Ví dụ:
AsyncSubject<Integer> source = AsyncSubject.create();
// It will get only 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will also get only get 4 and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
Kết luận
Trong tùy trường hợp, mà chúng ta sẽ có những lựa chọn phù hợp ứng với từng Subject, và có thể tận dụng được hết khả năng của RxJava.
Tham khảo
All rights reserved