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 */);
'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
Bazı durumlarda, kodunuzun okunabilirliğini gerçekten geliştirdiğinde BlockingObservable'ı kullanmanın uygun olduğunu söyleyebilirim. – scana
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