2015-12-17 5 views
6

मुझे लगता है कि किसी ने इसे आजमाया है, लेकिन अगर कोई अवलोकन करने योग्य लगता है तो मैं कुछ करने का अच्छा तरीका नहीं समझ सकता।यदि आप आरएक्सजेवा देखने योग्य लंबे समय तक लेते हैं तो आप स्पिनर कैसे दिखाते हैं?

यह वह प्रवाह है जो मैं चाहता हूं।

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. 

निकटतम मैं के बारे में सोच सकते हैं एक ज़िप

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

की तरह है कि वहाँ कुछ बेहतर करने के लिए है? मैं बिना किसी सफलता के पूरे दिन कोशिश कर रहा हूं। एक आदर्श दुनिया में मुझे लगता है कि मैं की तरह

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

उत्तर

5

कुछ आप खोज नमूदार प्रकाशित करने का समय समाप्त के माध्यम से ऐसा कर सकते हैं चाहते हो जाएगा:

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

यह दो गर्म गलियों में स्रोत विभाजित करके काम करता है: पहला लेन timeout ऑपरेटर चलाएगा जो समय के बाहर, साइड इफेक्ट के साथ एक और अवलोकन शुरू करता है जो कताई नियंत्रण दिखाता है। इसके लिए fromCallable का उपयोग करना है और इसके परिणाम को अनदेखा करना है (यह डुप्लिकेशन से भी बचता है)। दूसरा लेन अपरिवर्तित होगा और वास्तविक मूल्य प्रदान करने के लिए टाइमआउट लेन के साथ विलय हो जाएगा।

+0

'अवरुद्ध करने योग्य' दस्तावेज से: "लेकिन आम तौर पर उत्पादन अनुप्रयोगों के लिए अनुचित है (यदि आपको लगता है कि आपको अवरोधन का उपयोग करने की आवश्यकता है तो यह आमतौर पर एक संकेत है कि आपको अपने डिजाइन पर पुनर्विचार करना चाहिए)।" तो जब ब्लॉकिंग अवलोकन योग्य का उपयोग कर रहा है और कब नहीं? – Than

+0

मैं कहूंगा कि कुछ मामलों में BlockingObservable का उपयोग करना ठीक है, जब यह वास्तव में आपके कोड की पठनीयता में सुधार करता है। – scana

+0

मैंने प्रदर्शन उद्देश्यों के लिए यहां 'अवरुद्ध करने योग्य' का उपयोग किया था, इसलिए ऐप सभी प्रिंटलाइन देखने से पहले नहीं निकलता है। उत्पादन में, आप बस 'toBlocking' को कॉल नहीं करते हैं और यही वह है। – akarnokd

संबंधित मुद्दे

 संबंधित मुद्दे