2015-12-12 16 views
16

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.

+1

Đ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

+0

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 ... –

+1

'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

Trả lời

0

Bạn cần phải chắc chắn rằng bạn đăng ký vào cùng Quan sát dụ được trả về từ .cache(). Thông thường bạn sẽ lưu trữ trường hợp này ở đâu đó trong một Singleton (như lớp Ứng dụng), một đoạn được giữ lại hoặc một Dịch vụ Android.

+0

Hãy cẩn thận, vì bộ nhớ cache() cũng lưu trữ các lỗi! – scana

1

Bạn không nhất thiết phải sử dụng bất kỳ mẫu kiến ​​trúc nào để thực hiện điều đó. Mặc dù bất kỳ MVP/MVC là những điều tốt đẹp cho mối quan tâm tách, thử nghiệm vv, làm cho điều khiển của bạn/Presenter/DAO một đơn ứng dụng rộng, mà giữ lên bộ nhớ thông qua toàn bộ cuộc sống của ứng dụng không phải là một ý tưởng tốt.

Dưới đây là một dự án mẫu sử dụng Ví dụ mảnh giữ lại và RxJava - https://github.com/krpiotrek/RetainFragmentSample

Ý tưởng chính ở đó là sử dụng Fragment với setRetainInstance (true) gọi, để bảo vệ nó khỏi bị phá hủy về biến đổi định hướng, và lưu trữ của bạn Có thể quan sát được ở đó. Đây là cách bạn xử lý đó trong Hoạt động/Fragment onCreate

protected void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState == null) { 
     // first run, create observable 
     mInfoObservable = createInfoObservable(); 
     // set Observable in retained fragment 
     RetainFragmentHelper.setObject(this, getSupportFragmentManager(), mInfoObservable); 
    } else { 
     // following runs, get observable from retained fragment 
     mInfoObservable = RetainFragmentHelper.getObjectOrNull(this, getSupportFragmentManager()); 
    } 

    // subscribe 
    mInfoObservable.subscribe(...); 
} 

Hãy ghi nhớ rằng Quan sát của bạn có bộ nhớ cache giá trị cuối cùng, một cách là bộ nhớ cache sử dụng() điều hành.

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