2015-10-29 13 views
72

Retrofit नेटवर्क अनुरोध में Schedulers.io() का उपयोग करने के क्या फायदे हैं। मैंने कई उदाहरण देखे हैं जो io() का उपयोग करते हैं, लेकिन मैं समझना चाहता हूं क्यों।Rxjava Schedulers.newThread() बनाम Schedulers.io()

उदाहरण स्थिति:

observable.onErrorResumeNext(refreshTokenAndRetry(observable)) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread())... 

बनाम

observable.onErrorResumeNext(refreshTokenAndRetry(observable)) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread())... 

कारणों मैंने देखा है में से एक है -

newThread() काम की प्रत्येक इकाई के लिए एक नया धागा बनाता है। io() एक थ्रेड पूल

का उपयोग करेगा लेकिन ऐप पर उस तर्क का प्रभाव क्या है? और क्या अन्य पहलू हैं?

उत्तर

84

आप सही हैं कि Schedulers.io() का उपयोग करने का लाभ इस तथ्य में है कि यह थ्रेड पूल का उपयोग करता है, जबकि Schedulers.newThread() नहीं है।

थ्रेड पूल का उपयोग करने पर आपको प्राथमिक कारण यह समझना चाहिए कि वे कई पूर्व-निर्मित धागे बनाए रखते हैं जो निष्क्रिय हैं और काम की प्रतीक्षा कर रहे हैं। इसका मतलब है कि जब आपके पास काम करने के लिए काम होता है, तो आपको धागे बनाने के ऊपरी हिस्से में जाने की आवश्यकता नहीं होती है। एक बार आपका काम पूरा हो जाने के बाद, धागे को लगातार बनाने और नष्ट करने के बजाय भविष्य में काम के लिए उस थ्रेड का पुन: उपयोग किया जा सकता है।

धागे बनाने के लिए महंगा हो सकता है, इसलिए फ्लाई पर बने धागे की संख्या को कम करना आम तौर पर अच्छा है।

धागा पूल के बारे में अधिक जानकारी के लिए, मेरा सुझाव है:

+4

एक के आधार पर किया जा रहा Scheduler.io() के बारे में एक टिप्पणी जोड़ने के लायक हो सकता है असंबद्ध थ्रेड पूल जो कुछ उपयोग मामलों के लिए उपयुक्त नहीं हो सकता है। देखें http://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases –

+0

@ डेवमोटेन 'शेड्यूलर्स.ओ' के माध्यम से थ्रेड पूल के लिए केस का उपयोग अनुचित क्यों है? –

+2

यदि आपके पास 'Schedulers.io()' के साथ बहुत अधिक समवर्ती काम है तो आप ओएस i/o सीमाओं में टक्कर डाल सकते हैं (उदाहरण के लिए खुली फाइलों की अधिकतम संख्या, टीसीपी कनेक्शन की अधिकतम संख्या जो विश्वसनीयता के उद्देश्यों के लिए खुली रह सकती है निपटान के बाद भी एक अवधि के लिए)। प्रत्येक नए धागे को न्यूनतम गैर-तुच्छ राशि की आवश्यकता होती है (> 512 के लेकिन 1 एम पर काम) ताकि आप रैम से बाहर हो सकें। –