2015-12-17 17 views
6

Birinin bunu denemesi gerekiyormuş gibi hissediyorum, ancak gözlemlenebilir bir şey uzun sürerse bir şey yapmanın güzel bir yolunu anlayamıyorum.RxJava'nın gözlemlenebilirliği çok uzun sürerse, eğlendiriciyi nasıl gösterirsiniz?

İstediğim akış budur.

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. 

aklıma gelen en yakın 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 
     ); 

gibidir daha iyi bir şey yapmak mı? Bütün gün başarıya ulaşmaya çalışıyorum. Bu iki sıcak şerit halinde kaynak bölerek çalışır

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); 
}); 

: Ben Sen aşımı yoluyla gözlemlenebilir arama yayınlayarak yapabilirsiniz

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

cevap

5

gibi bir şey isteyeyim gibi Mükemmel bir dünyada hissediyorum: ilk şerit, zaman aşımına uğradığında, bir başka eğirme kontrolünü gösteren yan etki ile gözlemlenebilen bir timeout operatörünü çalıştıracaktır. Bunun yollarından biri, bunun için fromCallable'u kullanmak ve sonucunu görmezden gelmektir (bu aynı zamanda çoğaltmayı da önler). İkinci şerit değişmeyecek ve gerçek değeri vermek için zamanaşımı şeridiyle birleştirilecektir.

+0

'BlockingObservable' belgesinden:" Ancak, genellikle üretim uygulamaları için uygun değildir (bir BlockingObservable kullanmanız gerektiğini düşünüyorsanız, bu genellikle tasarımınızı yeniden düşünmeniz gereken bir işarettir). " Yani ne zaman engellenerek gözlemlenebilir uygun ve ne zaman kullanılır? – Than

+0

Bazı durumlarda, kodunuzun okunabilirliğini gerçekten geliştirdiğinde BlockingObservable'ı kullanmanın uygun olduğunu söyleyebilirim. – scana

+0

Gösteri amaçları için burada 'BlockingObservable'ı kullandım, böylece uygulama tüm baskı hatlarını görmeden önce çıkmıyor. Üretimde, sadece 'Blocking' olarak adlandırılmazsınız ve işte bu kadar. – akarnokd

İlgili konular