RxJava - Hướng dẫn nhanh
RxJava là một phần mở rộng dựa trên Java của ReactiveX. Nó cung cấp triển khai hoặc dự án ReactiveX trong Java. Sau đây là các đặc điểm chính của RxJava.
Mở rộng mẫu người quan sát.
Hỗ trợ chuỗi dữ liệu / sự kiện.
Cung cấp cho các toán tử soạn các chuỗi với nhau một cách khai báo.
Xử lý các cấu trúc dữ liệu phân luồng, đồng bộ, an toàn và đồng thời trong nội bộ.
ReactiveX là gì?
ReactiveX là một dự án nhằm cung cấp khái niệm lập trình phản ứng cho các ngôn ngữ lập trình khác nhau. Lập trình phản ứng đề cập đến kịch bản trong đó chương trình phản ứng khi và khi dữ liệu xuất hiện. Nó là một khái niệm lập trình dựa trên sự kiện và các sự kiện có thể truyền đến các quan sát viên đăng ký.
Theo Reactive, họ đã kết hợp những gì tốt nhất của mẫu Observer, mẫu Iterator và mẫu chức năng.
Mẫu Observer được thực hiện đúng. ReactiveX là sự kết hợp của những ý tưởng tốt nhất từ mẫu Observer, mẫu Iterator và lập trình chức năng.
Lập trình chức năng
Lập trình chức năng xoay quanh việc xây dựng phần mềm sử dụng các chức năng thuần túy. Một hàm thuần túy không phụ thuộc vào trạng thái trước đó và luôn trả về cùng một kết quả cho cùng các tham số được truyền vào. Các chức năng thuần túy giúp tránh các vấn đề liên quan đến các đối tượng được chia sẻ, dữ liệu có thể thay đổi và các tác dụng phụ thường phổ biến trong môi trường đa luồng.
Lập trình phản ứng
Lập trình phản ứng đề cập đến lập trình theo hướng sự kiện trong đó các luồng dữ liệu đến theo kiểu không đồng bộ và được xử lý khi chúng đến.
Lập trình phản ứng chức năng
RxJava thực hiện cả hai khái niệm với nhau, trong đó dữ liệu của các luồng thay đổi theo thời gian và chức năng của người tiêu dùng phản ứng tương ứng.
Tuyên ngôn phản ứng
Tuyên ngôn phản ứng là một tài liệu trực tuyến nêu rõ tiêu chuẩn cao của hệ thống phần mềm ứng dụng. Theo tuyên ngôn, sau đây là các thuộc tính chính của một phần mềm phản ứng:
Responsive - Nên luôn đáp ứng kịp thời.
Message Driven - Nên sử dụng cách truyền thông điệp không đồng bộ giữa các thành phần để chúng duy trì mối ghép lỏng lẻo.
Elastic - Luôn đáp ứng ngay cả khi chịu tải cao.
Resilient - Luôn đáp ứng ngay cả khi bất kỳ (các) thành phần nào bị lỗi.
Các thành phần chính của RxJava
RxJava có hai thành phần chính: Observables và Observer.
Observable - Nó đại diện cho một đối tượng tương tự như Stream có thể phát ra không hoặc nhiều dữ liệu, có thể gửi thông báo lỗi, có thể kiểm soát tốc độ của đối tượng này trong khi phát ra một tập dữ liệu, có thể gửi dữ liệu hữu hạn cũng như vô hạn.
Observer- Nó đăng ký vào dữ liệu của Observable về trình tự và phản ứng trên mỗi mục của các có thể quan sát. Người quan sát được thông báo bất cứ khi nào Observable phát ra dữ liệu. Một Observer xử lý dữ liệu từng cái một.
Người quan sát không bao giờ được thông báo nếu các mục không có mặt hoặc một cuộc gọi lại không được trả lại cho một mục trước đó.
Thiết lập môi trường cục bộ
RxJava là một thư viện cho Java, vì vậy yêu cầu đầu tiên là phải cài đặt JDK trong máy của bạn.
Yêu cầu hệ thống
JDK | 1,5 trở lên. |
---|---|
Ký ức | Không có yêu cầu tối thiểu. |
Dung lượng đĩa | Không có yêu cầu tối thiểu. |
Hệ điều hành | Không có yêu cầu tối thiểu. |
Bước 1 - Xác minh cài đặt Java trong máy của bạn
Trước hết, mở bảng điều khiển và thực hiện một lệnh java dựa trên hệ điều hành bạn đang làm việc.
Hệ điều hành | Bài tập | Chỉ huy |
---|---|---|
các cửa sổ | Mở bảng điều khiển lệnh | c: \> java -version |
Linux | Mở Command Terminal | $ java -version |
Mac | Mở thiết bị đầu cuối | máy: <joseph $ java -version |
Hãy xác minh kết quả đầu ra cho tất cả các hệ điều hành -
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | phiên bản java "1.8.0_101" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.8.0_101) |
Linux | phiên bản java "1.8.0_101" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.8.0_101) |
Mac | phiên bản java "1.8.0_101" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.8.0_101) |
Nếu bạn chưa cài đặt Java trên hệ thống của mình, hãy tải xuống Bộ phát triển phần mềm Java (SDK) từ liên kết sau https://www.oracle.com. Chúng tôi giả sử Java 1.8.0_101 là phiên bản đã cài đặt cho hướng dẫn này.
Bước 2 - Đặt môi trường JAVA
Đặt JAVA_HOMEbiến môi trường để trỏ đến vị trí thư mục cơ sở nơi Java được cài đặt trên máy của bạn. Ví dụ.
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | Đặt biến môi trường JAVA_HOME thành C: \ Program Files \ Java \ jdk1.8.0_101 |
Linux | xuất JAVA_HOME = / usr / local / java-current |
Mac | export JAVA_HOME = / Library / Java / Home |
Nối vị trí trình biên dịch Java vào Đường dẫn Hệ thống.
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | Nối chuỗi C:\Program Files\Java\jdk1.8.0_101\bin ở cuối biến hệ thống, Path. |
Linux | xuất PATH = $ PATH: $ JAVA_HOME / bin / |
Mac | không yêu cầu |
Xác minh cài đặt Java bằng lệnh java -version Như đã giải thích ở trên.
Bước 3 - Tải xuống kho lưu trữ RxJava2
Tải xuống phiên bản mới nhất của tệp jar RxJava từ RxJava @ MVNRepository và Reactive Streams @ MVNRepository phụ thuộc của nó . Tại thời điểm viết hướng dẫn này, chúng tôi đã tải xuống rxjava-2.2.4.jar, react-Stream-1.0.2.jar và sao chép nó vào thư mục C: \> RxJava.
Hệ điều hành | Tên lưu trữ |
---|---|
các cửa sổ | rxjava-2.2.4.jar, react-stream-1.0.2.jar |
Linux | rxjava-2.2.4.jar, react-stream-1.0.2.jar |
Mac | rxjava-2.2.4.jar, react-stream-1.0.2.jar |
Bước 4 - Đặt Môi trường RxJava
Đặt RX_JAVAbiến môi trường để trỏ đến vị trí thư mục cơ sở nơi lưu trữ jar RxJava trên máy của bạn. Giả sử chúng ta đã lưu trữ rxjava-2.2.4.jar và react-Stream-1.0.2.jar trong thư mục RxJava.
Sr.No | Hệ điều hành & Mô tả |
---|---|
1 | Windows Đặt biến môi trường RX_JAVA thành C: \ RxJava |
2 | Linux xuất RX_JAVA = / usr / local / RxJava |
3 | Mac export RX_JAVA = / Library / RxJava |
Bước 5 - Đặt biến CLASSPATH
Đặt CLASSPATH biến môi trường để trỏ đến vị trí jar RxJava.
Sr.No | Hệ điều hành & Mô tả |
---|---|
1 | Windows Đặt biến môi trường CLASSPATH thành% CLASSPATH%;% RX_JAVA% \ rxjava-2.2.4.jar;% RX_JAVA% \ react-Stream-1.0.2.jar;.; |
2 | Linux export CLASSPATH = $ CLASSPATH: $ RX_JAVA / rxjava-2.2.4.jar: react-Stream-1.0.2.jar:. |
3 | Mac export CLASSPATH = $ CLASSPATH: $ RX_JAVA / rxjava-2.2.4.jar: react-Stream-1.0.2.jar:. |
Bước 6 - Kiểm tra thiết lập RxJava
Tạo một lớp TestRx.java như hình dưới đây:
import io.reactivex.Flowable;
public class TestRx {
public static void main(String[] args) {
Flowable.just("Hello World!")
.subscribe(System.out::println);
}
}
Bước 7 - Xác minh kết quả
Biên dịch các lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac Tester.java
Xác minh kết quả đầu ra.
Hello World!
Observables đại diện cho các nguồn dữ liệu trong đó Observers (Subscribers)lắng nghe họ. Tóm lại, một Observable phát ra các mục và một Người đăng ký sau đó sẽ tiêu thụ các mục này.
Có thể quan sát được
Observable cung cấp dữ liệu khi người đăng ký bắt đầu lắng nghe.
Observable có thể phát ra bất kỳ số lượng mục nào.
Có thể quan sát chỉ phát ra tín hiệu hoàn thành và không có mục nào.
Observable có thể kết thúc thành công.
Có thể quan sát không bao giờ kết thúc. ví dụ: một nút có thể được nhấp vào bất kỳ số lần nào.
Có thể quan sát được lỗi bất kỳ lúc nào.
Người đăng kí
Có thể quan sát được có nhiều người đăng ký.
Khi một Observable phát ra một mục, mỗi phương thức onNext () của người đăng ký sẽ được gọi.
Khi hoàn thành việc phát ra các mục có thể quan sát, mỗi phương thức onComplete () của người đăng ký sẽ được gọi.
Nếu một Observable phát ra lỗi, mỗi phương thức onError () của người đăng ký sẽ được gọi.
Sau đây là các lớp cơ sở để tạo ra các có thể quan sát.
Flowable- 0..N luồng, phát ra 0 hoặc n mục. Hỗ trợ dòng phản ứng và áp lực ngược.
Observable - 0..N chảy, nhưng không có áp suất ngược.
Single- 1 mục hoặc lỗi. Có thể được coi như một phiên bản phản ứng của cuộc gọi phương thức.
Completable- Không có mục phát ra. Được sử dụng như một tín hiệu để hoàn thành hoặc lỗi. Có thể được coi như một phiên bản phản ứng của Runnable.
MayBe- Không có mục nào hoặc phát ra 1 mục. Có thể được coi là phiên bản phản ứng của Tùy chọn.
Sau đây là các phương pháp thuận tiện để tạo các có thể quan sát trong lớp Quan sát được.
just(T item) - Trả về một Observable báo hiệu mục đã cho (tham chiếu không đổi) và sau đó hoàn thành.
fromIterable(Iterable source) - Chuyển đổi một chuỗi có thể lặp lại thành một nguồn quan sát có thể phát ra các mục trong chuỗi.
fromArray(T... items) - Chuyển đổi một Mảng thành một nguồn quan sát có thể phát ra các mục trong Mảng.
fromCallable(Callable supplier) - Trả về một Observable mà khi một người quan sát đăng ký vào nó, sẽ gọi một hàm mà bạn chỉ định và sau đó phát ra giá trị được trả về từ hàm đó.
fromFuture(Future future) - Chuyển đổi Tương lai thành Nguồn quan sát.
interval(long initialDelay, long period, TimeUnit unit) - Trả về một Observable phát ra 0L sau thời gian ban đầu và các số tăng dần sau mỗi khoảng thời gian sau đó.
Lớp Đơn đại diện cho phản hồi giá trị đơn. Có thể quan sát đơn lẻ chỉ có thể phát ra một giá trị thành công duy nhất hoặc một lỗi. Nó không phát ra sự kiện onComplete.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.Single<T> lớp học -
public abstract class Single<T>
extends Object
implements SingleSource<T>
Giao thức
Sau đây là giao thức tuần tự mà Single Observable hoạt động:
onSubscribe (onSuccess | onError)?
Ví dụ đơn
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.concurrent.TimeUnit;
import io.reactivex.Single;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
//Create the observable
Single<String> testSingle = Single.just("Hello World");
//Create an observer
Disposable disposable = testSingle
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.subscribeWith(
new DisposableSingleObserver<String>() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onSuccess(String value) {
System.out.println(value);
}
});
Thread.sleep(3000);
//start observing
disposable.dispose();
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Hello World
Lớp MayBe đại diện cho phản hồi trì hoãn. MayBe có thể quan sát có thể phát ra một giá trị thành công duy nhất hoặc không có giá trị nào.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.Single<T> lớp học -
public abstract class Maybe<T>
extends Object
implements MaybeSource<T>
Giao thức
Sau đây là giao thức tuần tự mà MayBe Observable vận hành:
onSubscribe (onSuccess | onError | OnComplete)?
Ví dụ về MayBe
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.concurrent.TimeUnit;
import io.reactivex.Maybe;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableMaybeObserver;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
//Create an observer
Disposable disposable = Maybe.just("Hello World")
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.subscribeWith(new DisposableMaybeObserver<String>() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onSuccess(String value) {
System.out.println(value);
}
@Override
public void onComplete() {
System.out.println("Done!");
}
});
Thread.sleep(3000);
//start observing
disposable.dispose();
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Hello World
Lớp Hoàn thành đại diện cho phản hồi trì hoãn. Có thể quan sát được hoàn thành có thể cho biết hoàn thành thành công hoặc lỗi.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.Completable lớp học -
public abstract class Completable
extends Object
implements CompletableSource
Giao thức
Sau đây là giao thức tuần tự mà Completable Observable hoạt động:
onSubscribe (onError | onComplete)?
Ví dụ hoàn thành
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.concurrent.TimeUnit;
import io.reactivex.Completable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableCompletableObserver;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
//Create an observer
Disposable disposable = Completable.complete()
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onStart() {
System.out.println("Started!");
}
@Override
public void onComplete() {
System.out.println("Done!");
}
});
Thread.sleep(3000);
//start observing
disposable.dispose();
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Started!
Done!
Lớp CompositeDisposable đại diện cho một vùng chứa có thể chứa nhiều đồ dùng một lần và cung cấp độ phức tạp O (1) khi thêm và loại bỏ đồ dùng một lần.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.disposables.CompositeDisposable lớp học -
public final class CompositeDisposable
extends Object
implements Disposable, io.reactivex.internal.disposables.DisposableContainer
Ví dụ về CompositeDisposable
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Maybe;
import io.reactivex.Single;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableMaybeObserver;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers;
import java.util.concurrent.TimeUnit;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
CompositeDisposable compositeDisposable = new CompositeDisposable();
//Create an Single observer
Disposable disposableSingle = Single.just("Hello World")
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.subscribeWith(
new DisposableSingleObserver<String>() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onSuccess(String value) {
System.out.println(value);
}
});
//Create an observer
Disposable disposableMayBe = Maybe.just("Hi")
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.subscribeWith(new DisposableMaybeObserver<String>() {
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onSuccess(String value) {
System.out.println(value);
}
@Override
public void onComplete() {
System.out.println("Done!");
}
});
Thread.sleep(3000);
compositeDisposable.add(disposableSingle);
compositeDisposable.add(disposableMayBe);
//start observing
compositeDisposable.dispose();
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Hello World
Hi
Sau đây là các toán tử được sử dụng để tạo một Observable.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Create Tạo một phương thức có thể quan sát từ đầu và cho phép phương thức quan sát viên gọi theo chương trình. |
2 | Defer Không tạo một Người quan sát cho đến khi một Người quan sát đăng ký. Tạo ra một quan sát mới cho mỗi người quan sát. |
3 | Empty/Never/Throw Tạo một Hành vi có thể quan sát được với hành vi hạn chế. |
4 | From Chuyển đổi đối tượng / cấu trúc dữ liệu thành có thể quan sát được. |
5 | Interval Tạo một số nguyên phát ra có thể quan sát theo trình tự với khoảng cách khoảng thời gian được chỉ định. |
6 | Just Chuyển đổi một đối tượng / cấu trúc dữ liệu thành một Có thể quan sát để phát ra cùng một loại hoặc cùng một loại đối tượng. |
7 | Range Tạo một số nguyên phát ra có thể quan sát theo trình tự của dải ô đã cho. |
số 8 | Repeat Tạo một số nguyên phát ra có thể quan sát được liên tiếp nhiều lần. |
9 | Start Tạo một Observable để phát ra giá trị trả về của một hàm. |
10 | Timer Tạo một mục có thể quan sát để phát ra một mục sau độ trễ nhất định. |
Tạo ví dụ về toán tử
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using fromArray operator to create an Observable
public class ObservableTester {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable = Observable.fromArray(letters);
observable
.map(String::toUpperCase)
.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
ABCDEFG
Sau đây là các toán tử được sử dụng để biến đổi một mục được phát ra từ một Có thể quan sát.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Buffer Thu thập các mục từ Có thể quan sát thành các nhóm theo định kỳ và sau đó phát ra các nhóm chứ không phải các mục. |
2 | FlatMap Được sử dụng trong các đối tượng quan sát lồng nhau. Chuyển đổi các mục thành Có thể quan sát. Sau đó san phẳng các mục thành có thể quan sát duy nhất. |
3 | GroupBy Chia một Có thể quan sát thành tập hợp các Có thể quan sát được tổ chức theo khóa để tạo ra các nhóm mục khác nhau. |
4 | Map Áp dụng một chức năng cho mỗi mục được phát ra để biến đổi nó. |
5 | Scan Áp dụng một hàm cho từng mục được phát ra, tuần tự và sau đó phát ra giá trị kế tiếp. |
6 | Window Thu thập các mục từ Có thể quan sát vào cửa sổ Có thể quan sát theo định kỳ và sau đó phát ra các cửa sổ chứ không phải các mục. |
Ví dụ về toán tử chuyển đổi
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using map operator to transform an Observable
public class ObservableTester {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable = Observable.fromArray(letters);
observable
.map(String::toUpperCase)
.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
ABCDEFG
Sau đây là các toán tử được sử dụng để phát ra (các) mục có chọn lọc từ một Có thể quan sát.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Debounce Chỉ phát ra các mục khi hết thời gian chờ xảy ra mà không phát ra một mục khác. |
2 | Distinct Chỉ phát ra các mục duy nhất. |
3 | ElementAt chỉ phát ra mục ở chỉ số n do một Observable phát ra. |
4 | Filter Chỉ phát ra những mục vượt qua chức năng vị từ đã cho. |
5 | First Phát ra mục đầu tiên hoặc mục đầu tiên đã vượt qua tiêu chí đã cho. |
6 | IgnoreElements Không phát ra bất kỳ mục nào từ Có thể quan sát nhưng đánh dấu hoàn thành. |
7 | Last Phát ra phần tử cuối cùng từ Có thể quan sát. |
số 8 | Sample Phát ra mục gần đây nhất với khoảng thời gian nhất định. |
9 | Skip Bỏ qua n mục đầu tiên khỏi một Có thể quan sát. |
10 | SkipLast Bỏ qua n mục cuối cùng khỏi một Có thể quan sát. |
11 | Take lấy n mục đầu tiên từ một Observable. |
12 | TakeLast lấy n mục cuối cùng từ một Có thể quan sát. |
Ví dụ về toán tử lọc
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using take operator to filter an Observable
public class ObservableTester {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable = Observable.fromArray(letters);
observable
.take(2)
.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
ab
Sau đây là các toán tử được sử dụng để tạo một Observable duy nhất từ nhiều Observable.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | And/Then/When Kết hợp các bộ mặt hàng bằng cách sử dụng các trung gian Mẫu và Kế hoạch. |
2 | CombineLatest Kết hợp mục mới nhất được phát ra bởi mỗi Observable thông qua một chức năng được chỉ định và phát ra mục kết quả. |
3 | Join Kết hợp các mục được phát ra bởi hai Có thể quan sát nếu được phát ra trong khung thời gian của mục phát ra Có thể quan sát thứ hai. |
4 | Merge Kết hợp các mục được phát ra từ các Quan sát. |
5 | StartWith Phát ra một chuỗi các mục cụ thể trước khi bắt đầu phát các mục từ nguồn có thể quan sát được |
6 | Switch Phát ra các mục gần đây nhất do Observables phát ra. |
7 | Zip Kết hợp các mục của Observables dựa trên chức năng và phát ra các mục kết quả. |
Ví dụ về toán tử kết hợp
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using combineLatest operator to combine Observables
public class ObservableTester {
public static void main(String[] args) {
Integer[] numbers = { 1, 2, 3, 4, 5, 6};
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable1 = Observable.fromArray(letters);
Observable<Integer> observable2 = Observable.fromArray(numbers);
Observable.combineLatest(observable1, observable2, (a,b) -> a + b)
.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
g1g2g3g4g5g6
Sau đây là các toán tử thường hữu ích với Observables.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Delay Đăng ký hành động để xử lý các sự kiện vòng đời có thể quan sát được. |
2 | Materialize/Dematerialize Đại diện cho mục được phát ra và thông báo được gửi. |
3 | ObserveOn Chỉ định bộ lập lịch được quan sát. |
4 | Serialize Buộc có thể quan sát để thực hiện các cuộc gọi tuần tự. |
5 | Subscribe Hoạt động dựa trên sự phát thải của các mục và thông báo như hoàn thành từ một thiết bị có thể quan sát được |
6 | SubscribeOn Chỉ định bộ lập lịch sẽ được sử dụng bởi một Observable khi nó được đăng ký. |
7 | TimeInterval Chuyển đổi một có thể quan sát để phát ra các chỉ báo về khoảng thời gian đã trôi qua giữa các lần phát xạ. |
số 8 | Timeout Đưa ra thông báo lỗi nếu xảy ra thời gian cụ thể mà không phát ra bất kỳ mục nào. |
9 | Timestamp Đính kèm dấu thời gian cho mỗi mục được phát ra. |
9 | Using Tạo tài nguyên dùng một lần hoặc cùng tuổi thọ với tài nguyên có thể quan sát được. |
Ví dụ về toán tử tiện ích
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using subscribe operator to subscribe to an Observable
public class ObservableTester {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable = Observable.fromArray(letters);
observable.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
abcdefg
Sau đây là các toán tử đánh giá một hoặc nhiều Observable hoặc các mục được phát ra.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | All Đánh giá tất cả các mục được phát ra để đáp ứng các tiêu chí nhất định. |
2 | Amb Phát ra tất cả các mục từ Có thể quan sát đầu tiên chỉ được cung cấp nhiều Có thể quan sát. |
3 | Contains Kiểm tra xem một Observable có phát ra một mục cụ thể hay không. |
4 | DefaultIfEmpty Phát ra mục mặc định nếu Observable không phát ra bất kỳ thứ gì. |
5 | SequenceEqual Kiểm tra xem hai Bảng quan sát có phát ra cùng một chuỗi các mục không. |
6 | SkipUntil Loại bỏ các mục được phát ra bởi Có thể quan sát đầu tiên cho đến khi Có thể quan sát thứ hai tạo ra một mục. |
7 | SkipWhile Loại bỏ các mục do một Observable phát ra cho đến khi một điều kiện nhất định trở thành sai. |
số 8 | TakeUntil Loại bỏ các mục do một Observable phát ra sau khi một Observable thứ hai phát ra một mục hoặc kết thúc. |
9 | TakeWhile Loại bỏ các mục được phát ra bởi một Observable sau khi một điều kiện cụ thể trở thành sai. |
Ví dụ về toán tử có điều kiện
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using defaultIfEmpty operator to operate on an Observable
public class ObservableTester {
public static void main(String[] args) {
final StringBuilder result = new StringBuilder();
Observable.empty()
.defaultIfEmpty("No Data")
.subscribe(s -> result.append(s));
System.out.println(result);
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result1 = new StringBuilder();
Observable.fromArray(letters)
.firstElement()
.defaultIfEmpty("No data")
.subscribe(s -> result1.append(s));
System.out.println(result1);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
No Data
a
Sau đây là các toán tử hoạt động trên toàn bộ các mục được phát ra bởi một Observable.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Average Đánh giá mức trung bình của tất cả các mục và đưa ra kết quả. |
2 | Concat Phát ra tất cả các mục từ nhiều Có thể quan sát được mà không cần xen kẽ. |
3 | Count Đếm tất cả các mục và đưa ra kết quả. |
4 | Max Đánh giá mục có giá trị tối đa của tất cả các mục và đưa ra kết quả. |
5 | Min Đánh giá mục có giá trị tối thiểu của tất cả các mục và đưa ra kết quả. |
6 | Reduce Áp dụng một chức năng trên mỗi mục và trả về kết quả. |
7 | Sum Đánh giá tổng của tất cả các mục và đưa ra kết quả. |
Ví dụ về toán tử
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
//Using concat operator to operate on multiple Observables
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Integer[] numbers = { 1, 2, 3, 4, 5, 6};
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
Observable<String> observable1 = Observable.fromArray(letters);
Observable<Integer> observable2 = Observable.fromArray(numbers);
Observable.concat(observable1, observable2)
.subscribe( letter -> result.append(letter));
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
abcdefg123456
Sau đây là các nhà khai thác có quyền kiểm soát chính xác hơn đối với việc đăng ký.
Sr.No. | Nhà điều hành & Mô tả |
---|---|
1 | Connect Hướng dẫn một Observable có thể kết nối phát các mục cho người đăng ký của nó. |
2 | Publish Chuyển đổi một Observable thành Observable có thể kết nối. |
3 | RefCount Chuyển đổi một Observable có thể kết nối thành Observable thông thường. |
4 | Replay Đảm bảo mỗi người đăng ký có thể nhìn thấy cùng một chuỗi các mục đã phát, ngay cả sau khi Người quan sát đã bắt đầu phát các mục và người đăng ký đăng ký sau. |
Ví dụ về toán tử có thể kết nối
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
import io.reactivex.observables.ConnectableObservable;
//Using connect operator on a ConnectableObservable
public class ObservableTester {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g"};
final StringBuilder result = new StringBuilder();
ConnectableObservable<String> connectable = Observable.fromArray(letters).publish();
connectable.subscribe(letter -> result.append(letter));
System.out.println(result.length());
connectable.connect();
System.out.println(result.length());
System.out.println(result);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
0
7
abcdefg
Theo Reactive, một Chủ thể có thể hoạt động như cả Người quan sát và Người quan sát.
Chủ thể là một loại cầu nối hoặc proxy có sẵn trong một số triển khai của ReactiveX, hoạt động như một người quan sát và một người có thể quan sát được. Bởi vì nó là một người quan sát, nó có thể đăng ký một hoặc nhiều Quan sát và vì nó là một Người quan sát, nó có thể đi qua các mục mà nó quan sát bằng cách lắp lại chúng và nó cũng có thể phát ra các mục mới.
Có bốn loại Chủ thể -
Sr.No. | Miêu tả môn học |
---|---|
1 | Publish Subject Chỉ phát ra những mục được phát sau thời gian đăng ký. |
2 | Replay Subject Phát ra tất cả các mục được phát ra bởi nguồn Observable bất kể nó đã đăng ký Observable. |
3 | Behavior Subject Sau khi đăng ký, phát mục gần đây nhất, sau đó tiếp tục phát mục do nguồn có thể quan sát được. |
4 | Async Subject Phát ra mục cuối cùng được phát ra bởi nguồn có thể quan sát được sau khi hoàn thành phát. |
PublishSubject phát các mục cho Người quan sát hiện đã đăng ký và các sự kiện đầu cuối cho Người quan sát hiện tại hoặc muộn.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.subjects.PublishSubject<T> lớp học -
public final class PublishSubject<T>
extends Subject<T>
Ví dụ về PublishSubject
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.subjects.PublishSubject;
public class ObservableTester {
public static void main(String[] args) {
final StringBuilder result1 = new StringBuilder();
final StringBuilder result2 = new StringBuilder();
PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(value -> result1.append(value) );
subject.onNext("a");
subject.onNext("b");
subject.onNext("c");
subject.subscribe(value -> result2.append(value));
subject.onNext("d");
subject.onComplete();
//Output will be abcd
System.out.println(result1);
//Output will be d only
//as subscribed after c item emitted.
System.out.println(result2);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
abcd
d
BehaviorSubject phát ra mục gần đây nhất mà nó đã quan sát và sau đó tất cả các mục được quan sát tiếp theo cho mỗi Người quan sát đã đăng ký.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.subjects.BehaviorSubject<T> lớp học -
public final class BehaviorSubject<T>
extends Subject<T>
Ví dụ về BehaviorSubject
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.subjects.BehaviorSubject;
public class ObservableTester {
public static void main(String[] args) {
final StringBuilder result1 = new StringBuilder();
final StringBuilder result2 = new StringBuilder();
BehaviorSubject<String> subject = BehaviorSubject.create();
subject.subscribe(value -> result1.append(value) );
subject.onNext("a");
subject.onNext("b");
subject.onNext("c");
subject.subscribe(value -> result2.append(value));
subject.onNext("d");
subject.onComplete();
//Output will be abcd
System.out.println(result1);
//Output will be cd being BehaviorSubject
//(c is last item emitted before subscribe)
System.out.println(result2);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
abcd
cd
ReplaySubject phát lại các sự kiện / mục cho Người quan sát hiện tại và cuối cùng.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.subjects.ReplaySubject<T> lớp học -
public final class ReplaySubject<T>
extends Subject<T>
Ví dụ về ReplaySubject
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.subjects.ReplaySubject;
public class ObservableTester {
public static void main(String[] args) {
final StringBuilder result1 = new StringBuilder();
final StringBuilder result2 = new StringBuilder();
ReplaySubject<String> subject = ReplaySubject.create();
subject.subscribe(value -> result1.append(value) );
subject.onNext("a");
subject.onNext("b");
subject.onNext("c");
subject.subscribe(value -> result2.append(value));
subject.onNext("d");
subject.onComplete();
//Output will be abcd
System.out.println(result1);
//Output will be abcd being ReplaySubject
//as ReplaySubject emits all the items
System.out.println(result2);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
abcd
abcd
AsyncSubject phát ra giá trị cuối cùng duy nhất theo sau là sự kiện hoàn thành hoặc lỗi nhận được cho Người quan sát.
Khai báo lớp học
Sau đây là khai báo cho io.reactivex.subjects.AsyncSubject<T> lớp học -
public final class AsyncSubject<T>
extends Subject<T>
Ví dụ về AsyncSubject
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.subjects. AsyncSubject;
public class ObservableTester {
public static void main(String[] args) {
final StringBuilder result1 = new StringBuilder();
final StringBuilder result2 = new StringBuilder();
AsyncSubject<String> subject = AsyncSubject.create();
subject.subscribe(value -> result1.append(value) );
subject.onNext("a");
subject.onNext("b");
subject.onNext("c");
subject.subscribe(value -> result2.append(value));
subject.onNext("d");
subject.onComplete();
//Output will be d being the last item emitted
System.out.println(result1);
//Output will be d being the last item emitted
System.out.println(result2);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
d
d
Bộ lập lịch được sử dụng trong môi trường đa luồng để làm việc với các toán tử có thể quan sát.
Theo Reactive, Scheduler được sử dụng để lập lịch trình chuỗi các nhà khai thác sẽ áp dụng như thế nào cho các luồng khác nhau.
Theo mặc định, một Observable và chuỗi toán tử mà bạn áp dụng cho nó sẽ thực hiện công việc của nó và sẽ thông báo cho những người quan sát của nó, trên cùng một chuỗi mà phương thức Subscribe của nó được gọi. Toán tử SubscribeOn thay đổi hành vi này bằng cách chỉ định một Bộ lập lịch khác mà Observable sẽ hoạt động. Toán tử ObserOn chỉ định một Bộ lập lịch khác mà Người quan sát sẽ sử dụng để gửi thông báo cho người quan sát của nó.
Có các loại Bộ lập lịch sau đây có sẵn trong RxJava:
Sr.No. | Trình lập lịch & Mô tả |
---|---|
1 | Schedulers.computation() Tạo và trả về một Bộ lập lịch dành cho công việc tính toán. Số luồng được lên lịch phụ thuộc vào các CPU có trong hệ thống. Một luồng được phép cho mỗi CPU. Tốt nhất cho các vòng lặp sự kiện hoặc hoạt động gọi lại. |
2 | Schedulers.io() Tạo và trả về một Trình lập lịch dành cho công việc có IO. Nhóm chủ đề có thể mở rộng khi cần thiết. |
3 | Schedulers.newThread() Tạo và trả về một Bộ lập lịch trình tạo một Chuỗi mới cho mỗi đơn vị công việc. |
4 | Schedulers.trampoline() Tạo và trả về một Bộ lập lịch hàng đợi hoạt động trên luồng hiện tại sẽ được thực thi sau khi công việc hiện tại hoàn thành. |
4 | Schedulers.from(java.util.concurrent.Executor executor) Chuyển đổi Người thực thi thành một phiên bản Người lập lịch mới. |
Phương thức Schedulers.trampoline () tạo và trả về một Scheduler xếp hàng đợi hoạt động trên luồng hiện tại sẽ được thực thi sau khi công việc hiện tại hoàn thành.
Ví dụ về Schedulers.trampoline ()
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.Random;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable.just("A", "AB", "ABC")
.flatMap(v -> getLengthWithDelay(v)
.doOnNext(s -> System.out.println("Processing Thread "
+ Thread.currentThread().getName()))
.subscribeOn(Schedulers.trampoline()))
.subscribe(length -> System.out.println("Receiver Thread "
+ Thread.currentThread().getName()
+ ", Item length " + length));
Thread.sleep(10000);
}
protected static Observable<Integer> getLengthWithDelay(String v) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(3) * 1000);
return Observable.just(v.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Processing Thread main
Receiver Thread main, Item length 1
Processing Thread main
Receiver Thread main, Item length 2
Processing Thread main
Receiver Thread main, Item length 3
Phương thức Schedulers.newThread () tạo và trả về một Scheduler để tạo một Thread mới cho mỗi đơn vị công việc.
Ví dụ về Schedulers.newThread ()
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.Random;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable.just("A", "AB", "ABC")
.flatMap(v -> getLengthWithDelay(v)
.doOnNext(s -> System.out.println("Processing Thread "
+ Thread.currentThread().getName()))
.subscribeOn(Schedulers.newThread()))
.subscribe(length -> System.out.println("Receiver Thread "
+ Thread.currentThread().getName()
+ ", Item length " + length));
Thread.sleep(10000);
}
protected static Observable<Integer> getLengthWithDelay(String v) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(3) * 1000);
return Observable.just(v.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Processing Thread RxNewThreadScheduler-1
Receiver Thread RxNewThreadScheduler-1, Item length 1
Processing Thread RxNewThreadScheduler-2
Receiver Thread RxNewThreadScheduler-2, Item length 2
Processing Thread RxNewThreadScheduler-3
Receiver Thread RxNewThreadScheduler-3, Item length 3
Phương thức Schedulers.computation () tạo và trả về một Scheduler dành cho công việc tính toán. Số luồng được lên lịch phụ thuộc vào các CPU có trong hệ thống. Một luồng được phép cho mỗi CPU. Tốt nhất cho các vòng lặp sự kiện hoặc hoạt động gọi lại.
Ví dụ về Schedulers.computation ()
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.Random;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable.just("A", "AB", "ABC")
.flatMap(v -> getLengthWithDelay(v)
.doOnNext(s -> System.out.println("Processing Thread "
+ Thread.currentThread().getName()))
.subscribeOn(Schedulers.computation()))
.subscribe(length -> System.out.println("Receiver Thread "
+ Thread.currentThread().getName()
+ ", Item length " + length));
Thread.sleep(10000);
}
protected static Observable<Integer> getLengthWithDelay(String v) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(3) * 1000);
return Observable.just(v.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Processing Thread RxComputationThreadPool-1
Receiver Thread RxComputationThreadPool-1, Item length 1
Processing Thread RxComputationThreadPool-2
Receiver Thread RxComputationThreadPool-2, Item length 2
Processing Thread RxComputationThreadPool-3
Receiver Thread RxComputationThreadPool-3, Item length 3
Phương thức Schedulers.io () tạo và trả về một Scheduler dành cho công việc ràng buộc IO. Nhóm chủ đề có thể mở rộng khi cần thiết. Tốt nhất cho I / O hoạt động chuyên sâu.
Ví dụ về Schedulers.io ()
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.Random;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable.just("A", "AB", "ABC")
.flatMap(v -> getLengthWithDelay(v)
.doOnNext(s -> System.out.println("Processing Thread "
+ Thread.currentThread().getName()))
.subscribeOn(Schedulers.io()))
.subscribe(length -> System.out.println("Receiver Thread "
+ Thread.currentThread().getName()
+ ", Item length " + length));
Thread.sleep(10000);
}
protected static Observable<Integer> getLengthWithDelay(String v) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(3) * 1000);
return Observable.just(v.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 1
Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 2
Processing Thread RxCachedThreadScheduler-1
Receiver Thread RxCachedThreadScheduler-1, Item length 3
Phương thức Schedulers.from (Executor) chuyển đổi một Executor thành một thể hiện Scheduler mới.
Ví dụ về Schedulers.from (Executor)
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import java.util.Random;
import java.util.concurrent.Executors;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable.just("A", "AB", "ABC")
.flatMap(v -> getLengthWithDelay(v)
.doOnNext(s -> System.out.println("Processing Thread "
+ Thread.currentThread().getName()))
.subscribeOn(Schedulers.from(Executors.newFixedThreadPool(3))))
.subscribe(length -> System.out.println("Receiver Thread "
+ Thread.currentThread().getName()
+ ", Item length " + length));
Thread.sleep(10000);
}
protected static Observable<Integer> getLengthWithDelay(String v) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(3) * 1000);
return Observable.just(v.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Processing Thread pool-1-thread-1
Processing Thread pool-3-thread-1
Receiver Thread pool-1-thread-1, Item length 1
Processing Thread pool-4-thread-1
Receiver Thread pool-4-thread-1, Item length 3
Receiver Thread pool-3-thread-1, Item length 2
Toán tử đệm cho phép tập hợp các mục được phát ra bởi một Observable thành một danh sách hoặc các gói và phát ra các gói đó thay vì các mục. Trong ví dụ dưới đây, chúng tôi đã tạo một Observable để phát ra 9 mục và sử dụng bộ đệm, 3 mục sẽ được phát ra cùng nhau.
Ví dụ về đệm
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable<Integer> observable = Observable.just(1, 2, 3, 4,
5, 6, 7, 8, 9);
observable.subscribeOn(Schedulers.io())
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.buffer(3)
.subscribe(new Observer<List<Integer>>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("Subscribed");
}
@Override
public void onNext(List<Integer> integers) {
System.out.println("onNext: ");
for (Integer value : integers) {
System.out.println(value);
}
}
@Override
public void onError(Throwable e) {
System.out.println("Error");
}
@Override
public void onComplete() {
System.out.println("Done! ");
}
});
Thread.sleep(3000);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Subscribed
onNext:
1
2
3
onNext:
4
5
6
onNext:
7
8
9
Done!
Toán tử Windowing hoạt động tương tự như toán tử bộ đệm nhưng nó cho phép tập hợp các mục do một Observable phát ra vào một Observable khác thay vì tập hợp và phát ra Observable đó thay vì tập hợp. Trong ví dụ dưới đây, chúng tôi đã tạo một Observable để phát ra 9 mục và sử dụng toán tử cửa sổ, 3 Observable sẽ được phát ra cùng nhau.
Ví dụ về gió
Tạo chương trình Java sau đây bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> RxJava.
ObservableTester.java
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import java.util.concurrent.TimeUnit;
public class ObservableTester {
public static void main(String[] args) throws InterruptedException {
Observable<Integer> observable = Observable.just(1, 2, 3, 4,
5, 6, 7, 8, 9);
observable.subscribeOn(Schedulers.io())
.delay(2, TimeUnit.SECONDS, Schedulers.io())
.window(3)
.subscribe(new Observer<Observable<Integer>>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("Subscribed");
}
@Override
public void onNext(Observable<Integer> integers) {
System.out.println("onNext: ");
integers.subscribe(value -> System.out.println(value));
}
@Override
public void onError(Throwable e) {
System.out.println("Error");
}
@Override
public void onComplete() {
System.out.println("Done! ");
}
});
Thread.sleep(3000);
}
}
Xác minh kết quả
Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -
C:\RxJava>javac ObservableTester.java
Bây giờ hãy chạy ObservableTester như sau:
C:\RxJava>java ObservableTester
Nó sẽ tạo ra kết quả sau:
Subscribed
onNext:
1
2
3
onNext:
4
5
6
onNext:
7
8
9
Done!