2016-03-30 21 views
12

Ai đó có thể giải thích cho tôi sự khác biệt giữa các phương pháp defercreate trong Observable? Tôi thất bại trong việc hiểu khi tôi nên sử dụng defer và khi nào tôi nên sử dụng create ..Sự khác biệt giữa Observable.defer và Observable.create trong java rx

Tài liệu tham khảo:

Hoãn: http://reactivex.io/documentation/operators/defer.html

Tạo: http://reactivex.io/documentation/operators/create.html

Cảm ơn bạn

Trả lời

7

tạo (. ..) thực sự tạo ra Observable ngay lập tức.

public final static <T> Observable<T> create(OnSubscribe<T> f) { 
     return new Observable<T>(hook.onCreate(f)); 
    } 

Hoãn (...) chấp nhận chức năng máy trả về Quan sát (Chủ đề, vv ...), kết thúc tốt đẹp với nó OnSubscribeDefer và tạo Quan sát chỉ khi đăng ký cao thuê bao, mới Quan sát cho mỗi thuê bao.

public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) { 
    return create(new OnSubscribeDefer<T>(observableFactory)); 
} 

Xem một số chi tiết here

7

Vì vậy, sự khác biệt có vẻ là: defer là tốt khi bạn có cái gì đó tạo/trả về một thể quan sát được đã có, nhưng bạn không muốn nó quá trình đó xảy ra cho đến khi đăng ký.

create là tốt khi bạn cần phải tự bọc một quy trình không đồng bộ và tạo một quan sát. Sáng tạo đó là cũng bị hoãn cho đến khi đăng ký.

Nói một cách khác:

defer là một nhà điều hành cho phép thành phần thu nhập hoãn lại của chuỗi quan sát được.

create là triển khai tùy chỉnh chuỗi có thể quan sát được (nơi tạo ra được trì hoãn cho đến khi đăng ký). Vì vậy, nếu bạn có một tình huống mà bạn có thể sử dụng just để tạo ra một Observable từ một số kết quả/giá trị hoặc bạn có lớp API mạng trả về yêu cầu Observable của yêu cầu, nhưng bạn không muốn yêu cầu đó bắt đầu cho đến khi đăng ký. defer sẽ phù hợp cho các trường hợp đó.

Nếu bạn có một lớp mạng API mà không trở lại một Observable cho một yêu cầu, nhưng mà bạn cần một giao diện Observable đến, bạn có thể sử dụng create. Điều đó Observable trình tự vẫn sẽ không được tạo ra cho đến khi đăng ký mặc dù. Nếu bạn muốn cuộc gọi mạng đó khởi động bất kể đăng ký thì bạn sẽ sử dụng một cơ chế khác, chẳng hạn như Subject, có khả năng phát lại.

Các vấn đề liên quan