Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về Subject trong RxJava
- Publish Subject
- Replay Subject
- Behavior Subject
- Async Subject
Trước khi đi vào chi tiết trong bài viết, tôi có thể giới thiếu các bạn một ví dụ rất hay về rxjava 2 của tác giả amitshekhariitbhu , các bạn có thể tham khảo
amitshekhariitbhu/RxJava2-Android-Samples
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.
Tôi nghĩ rằng cách tốt nhất để học là thông qua những ví dụ
Observable : giả sử rằng một Giáo Sư ( a professor) là một observable. Vị giáo sư dậy về một vài topic(chủ đề).
Observer: giả sử rằng một sinh viên (student) là một observer. Student quan sát các topic đang được dậy bởi vị giáo sư.
Publish Subject
Nó phát ra tất cả các mục tiếp theo của nguồn observable tại thời điểm đăng ký.
Ở đây nếu một student vào lớp học muộn , thì student đó chỉ muốn lắng nghe tại thời điểm khi student đó vào lớp. Vậy publish sẽ là tốt nhất trong trường hợp sử dụng này.
Nhìn ví dụ bên dưới:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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ó phát ra tất cả các mục của nguồn Observable, bất kể khi subscriber đăng ký.
Ở đây, nếu một student vào lớp học muộn, student đó muốn nghe các bài học từ đầu. Vậy ở đây sẽ sử dụng Replay để có được điều này.
Nhìn ví dụ bên dưới:
1 2 3 4 5 6 7 8 9 10 11 | 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ó phát ra các mục đã được phát ra gần đây nhất và tất cả các mục tiếp theo của nguồn observable khi một observer đăng ký tới nó.
Ở đây nếu một student vào lớp học muộn, student đó muốn nghe mọi thứ gần nhất( không phải mọi thứ tại thời điểm bắt đầu) đang được dậy bởi professor để student đó có được idea của ngữ cảnh.
Vậy ở đây sẽ sử dụng Behavior.
1 2 3 4 5 6 7 8 9 10 11 | 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ỉ phát ra giá trị sau cùng của nguồn Observable ( chỉ duy nhất 1 giá trị sau cùng) duy nhất sau khi nguồn Observable là complete
Ở đây, nếu student vào lớp học bất cứ thời điểm nào và student đó chỉ muốn nghe duy nhất về một chủ đề cuối cùng (duy nhất một chủ đề cuối cùng) đang được dậy, sau khi lớp học kết thúc.
Vậy ở đây sẽ sử dụng Async
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); |
Tài liệu tham khảo: