2015-06-17 18 views
20

मेरी समस्या यह है कि मुझे Retrofit के साथ अनंत स्ट्रीम नहीं मिल सकती है। प्रारंभिक मतदान() अनुरोध के लिए मुझे प्रमाण-पत्र प्राप्त होने के बाद - मैं प्रारंभिक मतदान() अनुरोध करता हूं। प्रत्येक मतदान() अनुरोध 25 सेकंड में जवाब देता है यदि कोई बदलाव नहीं होता है, या इससे पहले कि कोई बदलाव हो - बदले में बदलना_डाटा []। प्रत्येक प्रतिक्रिया में अगले मतदान अनुरोध के लिए timestamp डेटा आवश्यक है - मुझे प्रत्येक मतदान() प्रतिक्रिया के बाद नया मतदान() अनुरोध करना चाहिए।आरएक्सजेवा + रेट्रोफिट लंबे मतदान

getServerApi().getLongPollServer() 
    .flatMap(longPollServer -> getLongPollServerApi(longPollServer.getServer()).poll("a_check", Config.LONG_POLLING_SERVER_TIMEOUT, 2, longPollServer.getKey(), longPollServer.getTs(), "") 
    .take(1) 
    .flatMap(longPollEnvelope -> getLongPollServerApi(longPollServer.getServer()).poll("a_check", Config.LONG_POLLING_SERVER_TIMEOUT, 2, longPollServer.getKey(), longPollEnvelope.getTs(), ""))) 
    .retry() 
    .subscribe(longPollEnvelope1 -> { 
    processUpdates(longPollEnvelope1.getUpdates()); 
}); 

मैं RxJava के लिए नया हूँ, शायद मैं कुछ समझ में नहीं आता, लेकिन मैं अनंत धारा नहीं मिल सकता है: यहाँ मेरी कोड है। मुझे 3 कॉल मिलती हैं, फिर अगला और पूर्ण पर।

पीएस शायद एंड्रॉइड पर लंबे मतदान को लागू करने के लिए एक बेहतर समाधान है?

+0

आपके मामले में मैं अपने स्वयं के 'पर्यवेक्षक' को 'Observable.create() ' –

उत्तर

11

आदर्श नहीं होने पर, मेरा मानना ​​है कि आप वांछित परिणाम ('डॉनऑन' ऑपरेशंस) प्राप्त करने के लिए आरएक्स के साइड इफेक्ट्स का उपयोग कर सकते हैं।

Observable<CredentialsWithTimestamp> credentialsProvider = Observable.just(new CredentialsWithTimestamp("credentials", 1434873025320L)); // replace with your implementation 

Observable<ServerResponse> o = credentialsProvider.flatMap(credentialsWithTimestamp -> { 
    // side effect variable 
    AtomicLong timestamp = new AtomicLong(credentialsWithTimestamp.timestamp); // computational steering (inc. initial value) 
    return Observable.just(credentialsWithTimestamp.credentials) // same credentials are reused for each request - if invalid/onError, the later retry() will be called for new credentials 
      .flatMap(credentials -> api.query("request", credentials, timestamp.get())) // this will use the value from previous doOnNext 
      .doOnNext(serverResponse -> timestamp.set(serverResponse.getTimestamp())) 
      .repeat(); 
}) 
     .retry() 
     .share(); 

private static class CredentialsWithTimestamp { 

    public final String credentials; 
    public final long timestamp; // I assume this is necessary for you from the first request 

    public CredentialsWithTimestamp(String credentials, long timestamp) { 
     this.credentials = credentials; 
     this.timestamp = timestamp; 
    } 
} 

जब 'ओ' की सदस्यता लेते हुए आंतरिक अवलोकन दोहराया जाएगा। अगर कोई त्रुटि हो तो 'ओ' पुनः प्रयास करेगा और क्रेडेंशियल स्ट्रीम से पुनः अनुरोध करेगा।

आपके उदाहरण में, टाइमस्टैम्प वैरिएबल को अपडेट करके कम्प्यूटेशनल स्टीयरिंग हासिल की जाती है, जो अगले अनुरोध के लिए जरूरी है।

+0

के साथ अपने उत्तर के लिए धन्यवाद देने पर विचार करता हूं। हालांकि, मुझे एपीआई से टाइमस्टैम्प मिलता है और मुझे इसे एक नए मतदान() कॉल के साथ भेजना चाहिए। – localhost

+0

मैंने आपकी स्थिति से उम्मीदपूर्वक निकटता से जवाब देने के लिए उत्तर अपडेट किया है। आप देख सकते हैं कि जब आप सर्वर रिस्पॉन्स प्राप्त करते हैं, तो आप बस एक चर सेट कर रहे हैं। "doOnNext" साइड इफेक्ट स्पष्ट बनाता है। मेरी चिंता यह है कि यह सुंदर नहीं है और हमें बेहतर जवाब देने के लिए आपका कोड देखना होगा। – snodnipper

+0

मेरे पास आपके कोड का उपयोग करके एक ही समस्या है और हल किया गया है लेकिन मेरे मामले में मैं पहली बार मूल्य भी स्टोर करना चाहता हूं। मैं उस कोड को कहां रख सकता हूं? – Krutik

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