2016-03-06 12 views
6

में एक ही समय में एकाधिक अनुरोधों को कैसे कॉल कर सकता हूं मेरे पास दो अलग-अलग आरईएसटी विधि हैं, और मैं उन्हें एक ही समय में कॉल करना चाहता हूं। मैं रेट्रोफिट 2 में यह कैसे कर सकता हूं?मैं रेट्रोफिट 2

मैं उन्हें एक-एक करके कॉल कर सकता हूं, लेकिन क्या रेट्रोफिट में कोई सुझाई गई विधि है?

मैं उम्मीद कुछ की तरह:

Call<...> call1 = myService.getCall1(); 
Call<...> call2 = myService.getCall2(); 

MagicRetrofit.call (call1,call2,new Callback(...) {...}); // and this calls them at the same time, but give me result with one method 

उत्तर

7

मैं रेट्रोफिट साथ RxJava का उपयोग कर पर एक नज़र ले जाएगा। मुझे Zip फ़ंक्शन, but there's a ton of others पसंद है।

odds = Observable.from([1, 3, 5, 7, 9]); 
evens = Observable.from([2, 4, 6]); 

Observable.zip(odds, evens, {o, e -> [o, e]}).subscribe(
    { println(it); },       // onNext 
    { println("Error: " + it.getMessage()); }, // onError 
    { println("Sequence complete"); }   // onCompleted 
); 

कौन सा में

[1, 2] 
[3, 4] 
[5, 6] 
Sequence complete 

रेट्रोफिट परिणाम और अधिक कठिन नहीं होना चाहिए: यहाँ जावा 8 का उपयोग पिन का एक उदाहरण है।

यदि आप स्टेटस कोड चाहते हैं तो आपके रेट्रोफिट सेवा ऑब्जेक्ट्स को Observable<...> या Observable<Result<...>> वापस करना चाहिए।

फिर आप फोन चाहते हैं:

Observable.zip(
    getMyRetrofitService().getCall1(), 
    getMyRetrofitService().getCall2(), 
    (result1, result2) -> return [result1,result2]) 
    .subscribe(combinedResults -> //Combined! Do something fancy here.) 
+0

अगर 1 अनुरोध विफल रहता है में दो कॉल करने के लिए, कि यह पूरे निष्पादन को रोको? @bkach? – ericn

+0

HTTP स्थिति कोड के संबंध में: रेट्रोफिट 1 के साथ, हाँ यह निष्पादन को रोक देगा और अपवाद फेंक देगा। रेट्रोफिट 2 के साथ यह नहीं करता है। [स्रोत (अनुरोध निष्पादन के तहत)] (https://futurestud.io/tutorials/retrofit-2-upgrade-guide-from-1-9)। अन्यथा - किसी भी अन्य "विफलता" (दुर्घटना, आदि) पर - हाँ यह निष्पादन को रोक देगा और अपवाद फेंक देगा। इसे 'ऑनरर' में संभाला जा सकता है जिसे मैंने उपर्युक्त उदाहरण में लागू नहीं किया है। – bkach

0

आप एक संग्रह में दोनों कॉल जोड़ सकते हैं और Java8 की parallelStream का उपयोग कर समानांतर

Arrays.asList(myService.getCall1(), myService.getCall2()).parallelStream().map(call->call.request()); 
संबंधित मुद्दे