android

Tìm Hiểu về Subject trong RxJava-Publish, Replay, Behavior Va Async Subject

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:

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:

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.

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

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:

https://blog.mindorks.com/understanding-rxjava-subject-publish-replay-behavior-and-async-subject-224d663d452f

http://reactivex.io/documentation/subject.html

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration