2017-04-01 12 views
5

कहा जाता है, मैं RxJava1 से RxJava2 में माइग्रेट करने का प्रयास कर रहा हूं। मैं सभी कोड भागों को प्रतिस्थापित कर रहा हूं जहां मेरे पास पहले Observable<Void> से Compleatable था। हालांकि मैं स्ट्रीम कॉल के आदेश के साथ एक समस्या में भाग गया। जब मैं पहले पर्यवेक्षकों से निपट रहा था और नक्शे और फ्लैट मैप्स का उपयोग कर कोड को 'अपेक्षित' काम करता था। हालांकि andthen() ऑपरेटर थोड़ा अलग काम करता प्रतीत होता है। समस्या को सरल बनाने के लिए यहां एक नमूना कोड है।अनुक्रम के आरएक्सजेवा 2 क्रम को पूर्ण करने योग्य और फिर ऑपरेटर

public Single<String> getString() { 
    Log.d("Starting flow..") 
    return getCompletable().andThen(getSingle()); 
} 

public Completable getCompletable() { 
    Log.d("calling getCompletable"); 
    return Completable.create(e -> { 
       Log.d("doing actuall completable work"); 
       e.onComplete(); 
      } 
    ); 
} 

public Single<String> getSingle() { 
    Log.d("calling getSingle"); 
    if(conditionBasedOnActualCompletableWork) { 
     return getSingleA(); 
    }else{ 
     return getSingleB(); 
    } 
} 

मैं अंत में लॉग में क्या देखते है:

1-> Log.d("Starting flow..") 
    2-> Log.d("calling getCompletable"); 
    3-> Log.d("calling getSingle"); 
    4-> Log.d("doing actuall completable work"); 

और मैं लाइन 4 लाइन 3 (बाद में इससे पहले कि andthen() ऑपरेटर के नाम के नाम से जाना उम्मीद होती है जैसा कि आप शायद यह पता लगाने कर सकते हैं सुझाव देते हैं कि कोड को 'पूरा' कहा जाएगा इसके बाद इसे पूरा करने का काम पूरा हो जाएगा)। पहले मैं Async.toAsync() ऑपरेटर का उपयोग कर रहा था और जिस विधि को अब getSingle कहा जाता है, flatMap स्ट्रीम में था - यह काम करता था जैसा कि मैंने उम्मीद की थी, इसलिए लॉग 4 3 से पहले दिखाई देगा। अब मैंने पूरा करने योग्य तरीके को बदलने की कोशिश की - जैसे fromAction या fromCallable का उपयोग करना, लेकिन यह वही व्यवहार करता है। मुझे andthen() को बदलने के लिए कोई अन्य ऑपरेटर भी नहीं मिला। रेखांकित करने के लिए - विधि एक पूर्णतया होनी चाहिए क्योंकि इसमें कोई चीज़ नहीं है जो वापस लौटने के लिए पूर्ण है - यह ऐप वरीयताओं और अन्य सेटिंग्स को बदलती है (और इसका उपयोग विश्व स्तर पर अधिकतर 'अपेक्षित' के रूप में किया जाता है) और बाद में उन परिवर्तनों की आवश्यकता होती है धारा में मैंने किसी भी तरह एकल बनाने के लिए getSingle() विधि को लपेटने की कोशिश की और निर्माण ब्लॉक के अंदर अगर कथन को स्थानांतरित किया लेकिन मुझे नहीं पता कि वहां के अंदर getSingleA/B() विधियों का उपयोग कैसे करें। और मुझे उनका उपयोग करने की आवश्यकता है क्योंकि उनके पास उनकी जटिलता है और कोड को डुप्लिकेट करने का कोई मतलब नहीं है। किसी को भी यह पता है कि RxJava2 में इसे कैसे संशोधित किया जाए, तो यह वही व्यवहार करता है? ऐसे कई स्थान हैं जहां मैं स्ट्रीम के साथ आगे बढ़ने से पहले एक पूर्ण करने योग्य नौकरी पर भरोसा करता हूं (जैसे ताज़ा सत्र टोकन, डीबी अपडेट करना, प्राथमिकता इत्यादि - फ्लैटमैप का उपयोग करके आरएक्सजेवा 1 में कोई समस्या नहीं)।

+0

क्या आप समझते हैं कि 'getSingle()' को तुरंत निष्पादित करता है और 'getCompletable' द्वारा लौटाए गए 'कॉम्प्लेबल' के बाद नहीं होता है? – akarnokd

उत्तर

1

आप आस्थगित करें उपयोग कर सकते हैं:

getCompletable().andThen(Single.defer(() -> getSingle())) 

इस तरह, आप getSingle() की सामग्री को तुरंत अमल नहीं है, लेकिन केवल जब Completable पूरा करता है और Single को andThen स्विच।

+0

टिप के लिए धन्यवाद, मैंने उत्तर को सहायक के रूप में चिह्नित किया - यह समस्या को हल करता है। हालांकि मुझे कहना होगा कि यह एक समाधान समाधान की तरह दिखता है। मैं अभी भी काफी परेशान हूं कि व्यवहार RxJava1 संस्करण बनाम क्यों बदल गया, जहां मैंने फ्लैटमैप का उपयोग किया और कॉलबैक उन क्रम में थे जिन्हें मैंने उम्मीद की थी। RxJava2 दस्तावेज़ों के 'नया क्या है' खंड में इसके बारे में कोई जानकारी नहीं मिली थी। –

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