2017-01-13 20 views
5

Tôi tìm thấy một vài bài báo nói về cách RxJava/RxAndroid có thể thay thế bus sự kiện (chẳng hạn như otto)RxAndroid, xe buýt sự kiện và hoạt động vòng đời

Một câu nói từ bài viết đầu tiên:

Otto từ Square chính thức nhận không được dùng các ngày trước đó. Trong thế giới Android, chúng ta có thể cổ vũ một cái gì đó giống như "EventBusses đã chết RxJava sống lâu".

Có một điều tôi đang mất tích mặc dù:

Một trong những đặc quyền của xe buýt sự kiện là họ giúp đỡ rất nhiều với vòng đời hoạt động trong đó bạn không cần phải quản lý đăng ký/unregistering để callbacks bằng tay (và do đó tránh rò rỉ bộ nhớ một cách dễ dàng)

Ví dụ dòng chảy:

  • Hoạt động đăng ký vào một sự kiện để nhận bài hát (nói SongsAvailableEvent)
  • Chúng tôi yêu cầu bài hát (chúng tôi thực hiện một yêu cầu mạng)
  • Chúng tôi thay đổi định hướng giữa yêu cầu của thiết bị
  • Activity chết và một cái mới được xây dựng, mà cũng được đăng ký với SongsAvailableEvent
  • Các hoạt động mới được sự kiện và cập nhật giao diện người dùng và Hoạt động cũ (hiện đã chết) không nhận được sự kiện (yay!)

Các bài viết ở trên trông giống như dòng này được "giải quyết" bởi RxAndroid/RxJava, nhưng bằng cách sử dụng Rx bạn vẫn cần phải đăng ký/hủy đăng ký trên một Observable bằng tay khi bạn thay đổi hướng của thiết bị. Hơn nữa, nếu tôi muốn "tái sử dụng" yêu cầu được thực hiện trong một Observable, tôi cần phải bằng cách nào đó vẫn tồn tại nó để tôi sẽ đăng ký trên cùng một Observable trong Activity mới (tôi không chắc chắn làm thế nào để làm điều đó, nhưng nó là không phải là điểm :)).

Câu hỏi của tôi là: vấn đề này có dễ giải quyết được với RxAndroid/RxJava thuần túy hay tôi vẫn cần sử dụng Rx với xe buýt sự kiện/mở rộng Rx sử dụng thứ gì đó như RxLifecycle (điều này làm phức tạp mọi thứ vì tôi không quản lý Quan sát của mình lớp trình bày)?

Trả lời

0

Hoạt động của bạn onDestroy luôn có thể gọi hủy đăng ký.

Để làm cho mọi thứ hoạt động để tái sử dụng yêu cầu- Hãy xem trong Trình tải và Trình quản lý tải. EventBus và RxJava để giải quyết điều đó không bao giờ cần thiết.

+0

Tôi không muốn hủy đăng ký theo cách thủ công, đó là lỗi dễ xảy ra. Với otto, tôi có thể đặt unregister (this) trong lớp cơ sở của Activity, và chúng ta đã xong, nhưng sử dụng Rx tôi cần theo dõi trên Observables của mình. Đối với Trình tải, chúng tuyệt vời cho các tập dữ liệu, nhưng chúng là một biến chứng quá mức đối với một số yêu cầu – dors

0

Tôi muốn mạo hiểm nói rằng không có cách nào ngoài thực tế là tại một số thời điểm trong chuỗi, Observable phải được gắn liền với vòng đời của một số đối tượng nền tảng Android, chẳng hạn như Hoạt động. Ngoài ra, bởi vì bạn đã không đề cập đến nó như là một giải pháp một phần, tôi giả sử bạn đang tránh sử dụng các mảnh vỡ được giữ lại. Nếu bạn đang tạo và giữ tham chiếu đến Chỉ quan sát được trong Hoạt động của mình, không thể cho kết quả yêu cầu trên máy bay để tồn tại việc hủy Hoạt động và tự động được đăng ký với hoạt động mới.Ngoài ra, tại một thời điểm nào đó, trong khi thay đổi định hướng hoặc Hoạt động kết thúc ở giữa yêu cầu mạng, Đài quan sát của bạn sẽ rò rỉ tham chiếu đến Hoạt động (qua số gọi lại là subscribe()) nếu nó không được hủy đăng ký trên Hoạt động onDestroy().

Tôi đã tìm thấy RxLifecycle đơn giản để sử dụng. My lớp cơ sở Activity có một phương pháp trên đó:

public <T> Observable.Transformer<T,T> bindLifecycleOnMainThread() { 
    return o -> o.compose(lifecycleProvider.bindToLifecycle()) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

lifecycleProvider được tạo ra theo các hướng dẫn để RxLifecycle, tùy thuộc vào cách bạn tạo cung cấp dịch vụ của bạn. Triển khai cụ thể này sử dụng bindToLifecycle() thay vì chỉ định một sự kiện vòng đời rõ ràng, do đó việc sử dụng nó là theo ngữ cảnh. Gọi điện thoại trong thời gian onResume sẽ làm cho nó kết thúc vào . Gọi điện thoại trong thời gian onStart sẽ khiến thiết bị kết thúc vào onStop. Gọi nó lần khác sẽ làm cho nó kết thúc vào onDestroy. Vì đăng ký này sẽ cập nhật giao diện người dùng, nó chỉ phải được quan sát trên chuỗi giao diện người dùng.

này sau đó có thể được sử dụng trong Hoạt động như sau:

yourObservable.compose(bindLifecycleOnMainThread()) 
    .subscribe(event -> handleEvent(event)); 

Bây giờ, nơi thực hiện điều này quan sát được đến từ đâu? Vâng, vẫn không có phép thuật, và nếu bạn muốn một Observable có tuổi thọ dài hơn Activity, điều đó có nghĩa là Observable phải được giữ bởi một thành phần tồn tại lâu hơn Activity. Có rất nhiều cách để thực hiện việc này, nhưng trường hợp sử dụng cụ thể của bạn ánh xạ tốt tới thư viện ViewModel mới có trong khung Android Architecture. Nếu bạn sử dụng ViewModels, ViewModel của bạn sẽ có phương thức bắt đầu yêu cầu mạng và sẽ có một số PublishSubject hoặc PublishRelay sẽ phát ra các đối tượng SongsAvailableEvent (mặc dù tôi khuyên bạn nên hiển thị đối tượng đó là Hoạt động của bạn chỉ với Observable<SongsAvailableEvent> chứ không phải Chủ đề) đóng gói tốt!). ViewModel của bạn sẽ thực hiện cuộc gọi mạng và chuyển tiếp kết quả đến Chủ đề của bạn.

Cuối cùng, Hoạt động của bạn, khi được tạo, sẽ ngay lập tức nhận được ViewModel từ đăng ký ViewModel và đăng ký Observable<SongsAvailableEvent> (là Chủ đề/Tiếp sức) mà ViewModel hiển thị và sau đó liên kết nó với vòng đời của Hoạt động, như trong ví dụ trên. ViewModel sẽ tồn tại bất kỳ thay đổi định hướng nào của Hoạt động và do đó sẽ có thể quan sát được. The Observable sau đó sẽ không bao giờ cố gắng cung cấp một sự kiện cho một Activity bị hủy và Activity mới sẽ ngay lập tức bắt đầu lắng nghe các sự kiện.

Tôi tin rằng chiến lược này khuyến khích đóng gói tốt, vì Hoạt động không tự quan tâm đến cách yêu cầu mạng được thực hiện và không tự quan tâm đến cách nguồn có thể quan sát được. Cách duy nhất để Activity thao tác Observable là bằng cách chọn những gì xảy ra khi nó nhận được một sự kiện và ràng buộc việc đăng ký với vòng đời của Activity.

Điều này có thể được tinh chỉnh và tinh chỉnh không ngừng bằng cách soạn các Đài quan sát nhưng điều này sẽ giúp bạn trên đường đi.

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