6

Giả sử tôi có Lưu lượng được chia sẻ giữa các phần khác nhau của ứng dụng.Tôi có cần phải vứt bỏ() Nhà xuất bản được tạo bằng LiveDataReactiveStreams

Trong mỗi đoạn mà tôi muốn quan sát nó, tôi chuyển đổi nó thành LiveData với LiveDataReactiveStreams.fromPublisher để tránh rò rỉ và treo. Bây giờ tôi có một LiveData kết thúc tốt đẹp Flowable của tôi.

Tôi sau đó chuyển LiveData vào ViewModel của tôi (trong ViewModelFactory). Theo tôi hiểu, tôi có thể tiếp tục và sử dụng LiveData mà không phải lo lắng về rò rỉ.

Bây giờ, thay vì quan sát trực tiếp LiveData, tôi bị cám dỗ chuyển đổi nó trở lại thành Flowable với LiveDataReactiveStreams.toPublisherFlowable.fromPublisher và đăng ký Flowable để thay thế. Đây là một Flowable kết thúc tốt đẹp một LiveData mà kết thúc tốt đẹp một Flowable

Câu hỏi của tôi là: Tôi có phải lo lắng về việc xử lý các đăng ký cho Flowable này? Hy vọng của tôi là LiveData sẽ hoạt động như một "rào cản", ngăn cản bối cảnh của tôi bị rò rỉ trở lại với root Flowable, nhưng tôi không chắc chắn về điều đó.

Nói cách khác:

  1. Bê tông lỏng Một tồn tại trong bối cảnh toàn cầu
  2. Trong mỗi đoạn, Một được gói trong LiveData B được thiết lập như là một tài sản của các mảnh vỡ ViewModel
  3. Khi bình thường tôi sẽ quan sát LiveData B, thay vào đó, hãy bọc nó trong Flowable C
  4. Tôi đăng ký vào Bê tông lỏng C và bỏ qua một lần

Sẽ xem lại truy cập trong C bị rò rỉ lên đến Một khi phân đoạn bị phá hủy?

Trả lời

1

Xem xét current implementation, bạn vẫn cần phải chăm sóc đăng ký theo cách thủ công. Vòng đời chỉ được sử dụng để xử lý việc quan sát dữ liệu trực tiếp.

mLiveData.observe(mLifecycle, LiveDataSubscription.this); 

Quan sát chỉ bị hủy tự động khi số lượng mục không tích cực được yêu cầu và lỗi được gửi. Điều này sau đó loại bỏ các thuê bao. Kể từ khi nhà sản xuất không bao giờ hoàn thành nó sẽ không bao giờ vứt bỏ các thuê bao của chính nó và do đó bạn sẽ bị rò rỉ các thuê bao nếu bạn không vứt bỏ nó cho mình.

+0

Tôi hiểu rằng nó không hủy đăng ký cho tôi, nhưng câu hỏi của tôi là: Liệu nó có thực sự bị rò rỉ khi đoạn bị phá hủy không? Nếu vậy, nơi nào/như thế nào rò rỉ này xảy ra? –

+0

Nó sẽ rò rỉ đăng ký của bạn cho nhà xuất bản. – tynn

+0

Tôi đang ở với bạn điều này, nhưng nhà xuất bản không phải là GC: ed (cùng với đăng ký) khi đoạn là GC: ed? Theo tôi có thể thấy, tất cả các tham chiếu được tạo ra ở đây là hình tròn, điều này sẽ ngăn chặn rò rỉ xảy ra (trừ khi tôi làm điều gì đó rõ ràng là ngu ngốc) –

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