Tôi vẫn đang tìm ra RxJava và sử dụng nó để thực hiện một số công cụ mạng với Retrofit 2. Đã thử nó trong vài ngày và như vậy mã có vẻ dễ đọc hơn nhưng đã gặp một vấn đề mà tôi không thể hình dung một cách xung quanh.RxJava đăng ký lại sự kiện sau khi khôi phục hoạt động
Tôi đang cố thực hiện đăng nhập (trả về mã thông báo API) và sau đó sử dụng mã thông báo này để tìm nạp một số dữ liệu ban đầu trong cùng một chuỗi sao cho đầu ra của chuỗi là mã thông báo + dữ liệu. Để thực hiện điều này, tôi gọi dịch vụ API của tôi với số
apiClient
.login()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(token -> getData(token))
.subscribe(new Subscrber<Bundle>() {...});
Điều này có vẻ tốt nhưng tôi cũng muốn hiển thị thanh tiến trình khi bắt đầu và dừng chuỗi. Vì vậy, tôi đã thêm một số .doOnSubscribe()
và một số .doOnUnsubscribe()
cho điều này. Tuy nhiên tôi nhận thấy rằng sau khi định hướng thay đổi mảnh mà tôi đã cố gắng để ẩn thanh tiến trình luôn luôn là null.
Vì vậy, tôi đã tìm kiếm và đã truy cập vào RxLifecycle lib có vẻ như nó sẽ hữu ích và bây giờ tôi là .cache()
và hủy đăng ký khỏi chuỗi sự kiện. Nhưng tôi không thể tìm ra cách để đăng ký vào cùng một sự kiện một lần nữa trong onCreate()
sau này? Tôi nghĩ rằng tôi đang thiếu một cái gì đó khá cơ bản và sẽ đánh giá cao bất kỳ sự giúp đỡ với điều này.
Điều tốt nhất bạn có thể làm là tách logic của bạn và triển khai mẫu 'MVP'. Sau đó bạn 'Presenter' lớp (mà lý tưởng nên được singleton cho mỗi trường hợp xem) sẽ xử lý tất cả các mạng và giữ cho trên xem xây dựng lại sau khi xoay màn hình. Trên thực tế có thư viện khá gọn gàng cho phép sử dụng mẫu 'MVP' dựa trên rxJava https://github.com/konmik/nucleus (nó thực sự nhỏ). Thậm chí nếu bạn không muốn sử dụng nó, bạn có thể có được một ý tưởng làm thế nào nó có thể được thực hiện – Than
hmm .. ok vì vậy tôi đoán tôi cần phải đọc lên trên một thực hiện MVP tốt cũng như trước khi đi xuống tuyến đường RxJava ... –
'MVP' có thể làm cho mã của bạn sạch hơn và sẽ giải quyết vấn đề này, nhưng có lẽ nó không phải là giải pháp bạn đang tìm kiếm (không dễ dàng chuyển toàn bộ kiến trúc ứng dụng sang MVP) (đó là lý do tại sao tôi không đăng nó câu trả lời). Tôi chắc rằng bạn có một cách để làm điều đó mà không có 'MVP' bằng cách sử dụng lib bên thứ 3 hoặc một số mẫu đẹp nhưng tôi không có bất kỳ giải pháp sạch nào. Hãy đối xử với nhận xét trên của tôi là "cách người khác xử lý vấn đề tương tự". – Than