मुझे वास्तव में आरएक्सजेवा पसंद है, यह एक अद्भुत टूल है लेकिन कभी-कभी यह समझना बहुत कठिन होता है कि यह कैसे काम करता है। हम अपने एंड्रॉइड प्रोजेक्ट में आरएक्सजेवा के साथ रेट्रोफिट का उपयोग करते हैं और निम्नलिखित उपयोग-मामले हैं:सर्वर छोड़ने के लिए RxJava में "repeatWhen" के साथ संयुक्त "skipWhile" का उपयोग
मुझे सर्वर को मतदान करने की आवश्यकता है, रिट्रीज़ के बीच कुछ देरी के साथ, सर्वर कुछ काम कर रहा है। जब सर्वर किया जाता है तो मुझे परिणाम देना होगा। इसलिए मैं सफलतापूर्वक RxJava साथ यह किया है, यहाँ कोड का टुकड़ा है: मैं "repeatWhen"
Subscription checkJobSubscription = mDataManager.checkJob(prepareTweakJob)
.skipWhile(new Func1<CheckJobResponse, Boolean>() {
@Override
public Boolean call(CheckJobResponse checkJobResponse) {
boolean shouldSkip = false;
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, jobStatus " + checkJobResponse.getJobStatus());
switch (checkJobResponse.getJobStatus()){
case CheckJobResponse.PROCESSING:
shouldSkip = true;
break;
case CheckJobResponse.DONE:
case CheckJobResponse.ERROR:
shouldSkip = false;
break;
}
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, shouldSkip " + shouldSkip);
return shouldSkip;
}
})
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, repeatWhen " + observable);
return observable.delay(1, TimeUnit.SECONDS);
}
}).subscribe(new Subscriber<CheckJobResponse>(){
@Override
public void onNext(CheckJobResponse response) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, onSuccess, response " + response);
}
@Override
public void onError(BaseError error) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, onError, canEditTimeline, error " + error);
Toast.makeText(ChoseEditOptionActivity.this, R.string.NETWORK__no_internet_message, Toast.LENGTH_LONG).show();
}
@Override
public void onCompleted() {
if (SHOW_LOGS) Logger.v(TAG, "onCompleted");
}
});
के साथ "skipWhile" का इस्तेमाल किया कोड ठीक काम करता है: मैं
जब सर्वर ने जवाब दिया कि काम संसाधित कर रहा है "skipWhile" श्रृंखला से "सत्य" लौटें, मूल पर्यवेक्षक 1 सेकंड के लिए प्रतीक्षा करता है और फिर से http अनुरोध करता है। यह प्रक्रिया दोहराई जाती है जब तक कि मैं "skipWhile" श्रृंखला से "झूठी" वापस नहीं आती।
यहाँ कुछ चीजें है मुझे समझ नहीं आता:
मैं "skipWhile" के दस्तावेज में देखा है कि यह मूल प्रत्यक्ष से कुछ भी (onError, onNext, onComplete) का उत्सर्जन नहीं होगा जब तक मैं वापस जाने के इसकी "कॉल" विधि से "झूठा"। तो अगर यह कुछ भी नहीं निकलता है तो "दोहराना कब" पर्यवेक्षक इसे नौकरी कर रहा है? यह एक सेकंड के लिए इंतजार कर रहा है और अनुरोध फिर से चलाता है। इसे किसने लॉन्च किया?
दूसरा सवाल यह है: क्यों "दोहराना" हमेशा से नहीं चल रहा है, मेरा मतलब है कि जब मैं "skipWhile" से "झूठी" वापस लौटता हूं तो क्यों दोहराना बंद कर देता है? अगर मैं "झूठी" लौटाता हूं तो मैं अपने सब्सक्राइबर में सफलतापूर्वक आगे बढ़ता हूं।
"दोहराना समय" के प्रलेखन में यह कहता है कि अंत में मुझे अपने सब्सक्राइबर में "पूर्ण" पर कॉल करने के लिए कॉल किया जाता है लेकिन "ऑन कॉम्प्ले" कभी नहीं कहा जाता है।
अगर मैं "skipWhile" और "repeatWhen" चेनिंग के क्रम को बदलता हूं तो इससे कोई फर्क नहीं पड़ता। ऐसा क्यों है ?
मैं समझता हूं कि आरएक्सजेवा ओपनसोर्स है और मैं सिर्फ कोड पढ़ सकता हूं, लेकिन जैसा कि मैंने कहा - यह समझना वाकई मुश्किल है।
धन्यवाद।
मैंने एक टाइपो बनाया: मैंने "skipWhile" के प्रलेखन में देखा कि जब तक मैं अपनी "कॉल" विधि से "झूठी" वापस नहीं लौटाता तब तक यह मूल अवलोकन से कुछ भी नहीं (ऑनर, ऑन अगला, ऑन कॉम्प्लेट) को छोड़ देगा। यहां मूल दस्तावेज है: एक अवलोकन योग्य लौटाता है जो स्रोत द्वारा उत्सर्जित सभी वस्तुओं को छोड़ देता है जब तक निर्दिष्ट * स्थिति सत्य होती है, लेकिन जैसे ही स्थिति झूठी हो जाती है, सभी स्रोत स्रोतों को उत्सर्जित करती है। तो मुझे पहले कुछ बार "प्रक्रिया" मिलती है और विधि से "सत्य" वापस आती है। यह कुछ भी उत्सर्जित नहीं करना चाहिए। तो फिर क्यों चल रहा है? –
# 2 के संबंध में। नहीं, मेरे पास केवल एक कोड है जो सदस्यता के चालू होने पर सदस्यता को सदस्यता रद्द करता है, लेकिन ऐसा नहीं है। मैंने देखा होगा कि मैं अभी भी एपीआई कॉल के साथ सर्वर को मतदान कर रहा हूं :) –
पहली टिप्पणी के बारे में - चेकजोब() के उत्सर्जन शायद 'अगला (चेकजोब रिस्पॉन्स) '-> पर पूर्ण()' पर हैं। जब यह 'प्रोसेसिंग' लौटाता है, तो यह पहली बार अग्रेषित करता है, लेकिन 'पूर्ण() 'अभी भी हो जाता है। (मैंने स्रोत कोड को देखकर इसकी पुष्टि की।) –