2016-06-12 20 views
9

Có một số tình huống trong mã nguồn của tôi, nơi luồng tôi đăng ký sẽ chỉ phát ra một kết quả và do đó sử dụng rx.Single thay vì rx.Observable. Các documentation cho đơn nói như sau:Hủy đăng ký một rx.Chọn RxJava

Một đơn sẽ chỉ gọi một trong những phương pháp này, và sẽ chỉ gọi nó một lần. Khi gọi một trong hai phương thức, Single kết thúc và đăng ký để kết thúc.

Với truyền thống Observable tôi chụp một tham chiếu đến đăng ký để tôi có thể hủy đăng ký vào một thời điểm thích hợp và không gây ra rò rỉ bộ nhớ:

Subscription s = getObservable().subscribe(...); 
subscriptions.add(s); 
subscriptions.clear(); 

Câu hỏi của tôi là liệu điều này là cần thiết với một đơn hoặc cho dù thực tế là đăng ký kết thúc ngay lập tức, nó có thể được để lại đơn giản là:

getSingle.subscribe(...); 

Không có bất kỳ hậu quả tiêu cực nào của tài liệu tham khảo được lưu trữ vào người đăng kí.

+1

ah - để làm rõ đây không phải là danh sách, đó là một CompositeSubscription – Jahnold

Trả lời

8

Single không cho bạn biết bất cứ điều gì về bao lâu nó sẽ được chạy.

Vì bạn đang nhắm mục tiêu Android, câu trả lời là , bạn nên giữ đăng ký và hủy đăng ký.

Hãy tưởng tượng bạn đang chuyển đổi Phân đoạn/hoạt động và chạy dài SingleSubscribers'sonSuccess được gọi. Vì vậy, thời gian và không gian tốt nhất có thể là trong onPause(), nhưng nó phụ thuộc vào ngữ cảnh của bạn.

Bạn có thể chạy vào NullPinterExceptions, Bộ điều hợp đang được lấp đầy nhiều lần hoặc các sự cố tương tự nếu bạn không hủy đăng ký.

1

Bất kỳ lý do nào bạn cần xóa đăng ký trên Quan sát ?. Có thể quan sát bằng thiết kế khi người quan sát có tất cả các mục được tự động hủy đăng ký.

Và sau đó, vì bản sao không phải là tham chiếu nữa nên GC tại một số điểm sẽ dọn sạch cho bạn.

Bạn có thể xem trong ví dụ này cách đăng ký hủy đăng ký sau khi hoàn thành onComplete.

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/creating/ObservableSubscription.java

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