2015-12-17 22 views
6

Tôi cảm thấy như ai đó đã thử điều này, nhưng tôi không thể tìm ra một cách tốt đẹp để làm điều gì đó nếu có thể quan sát được lâu.Làm cách nào để hiển thị spinner nếu RxJava có thể quan sát được lâu?

Đây là luồng tôi muốn.

Start a search. 
If the search takes longer than some time, 
    show a spinner or show progress bar. 
When finished do subscription action and hide spinner/progress bar. 

Gần nhất tôi có thể nghĩ là giống như một Zip

manager.search(searchTerm) 
     .zip(Observable.Timer(1, TimeUnit.SECONDS)) 
     .subscribe(
      // if the search is non null then we are good 
      // if the long time is non 0 we need to show spinner 
     ); 

Có điều gì tốt hơn để làm gì? Tôi đã cố gắng cả ngày và không thành công. Trong một thế giới hoàn hảo Tôi cảm thấy như tôi muốn một cái gì đó giống như

manager.search(searchTerm) 
     .timeout(i -> /* do timeout stuff */, 1, TimeUnit.SECONDS) 
     .subscribe(item -> /* do search result stuff */); 

Trả lời

5

Bạn có thể làm điều này bằng việc xuất bản tìm kiếm Quan sát qua thời gian chờ:

Observable<Integer> source = Observable.just(1).delay(5, TimeUnit.SECONDS); 

source 
.doOnSubscribe(() -> System.out.println("Starting")) 
.publish(o -> 
    o.timeout(1, TimeUnit.SECONDS, Observable.<Integer>fromCallable(() -> { 
     System.out.println("Spinning..."); 
     return null; 
    })).ignoreElements().mergeWith(o) 
) 
.toBlocking() 
.subscribe(v -> { 
    System.out.println("Hide spinner if shown."); 
    System.out.println(v); 
}); 

này hoạt động bằng cách phân chia các nguồn thành hai làn xe nóng: làn đầu tiên sẽ chạy một toán tử timeout mà khi hết thời gian, bắt đầu một Quan sát khác với tác dụng phụ cho biết điều khiển quay. Một trong những cách là sử dụng fromCallable cho điều này và bỏ qua kết quả của nó (điều này cũng tránh trùng lặp). Làn thứ hai sẽ không thay đổi và được hợp nhất với làn thời gian chờ để phân phối giá trị thực tế.

+0

Từ tài liệu 'BlockingObservable':" Nhưng nói chung là không phù hợp cho các ứng dụng sản xuất (nếu bạn nghĩ rằng bạn cần sử dụng BlockingObservable thì đây thường là dấu hiệu cho thấy bạn nên suy nghĩ lại về thiết kế của mình). " Vì vậy, khi sử dụng chặn quan sát thích hợp và khi không? – Than

+0

Tôi sẽ nói rằng nó là ok để sử dụng BlockingObservable trong một số trường hợp, khi nó thực sự cải thiện khả năng đọc mã của bạn. – scana

+0

Tôi đã sử dụng 'BlockingObservable' ở đây cho mục đích trình diễn để ứng dụng không thoát trước khi nhìn thấy tất cả các bản in. Trong sản xuất, bạn chỉ cần không gọi 'toBlocking' và đó là nó. – akarnokd

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