2017-10-23 21 views
6

हाय मैं rxjava2 के बारे में जो async के संचालन के लिए मूल रूप से है पढ़ रहा हूँ। मैंने पाया कि इसमें एक ऑपरेटर अवधारणा है जो एंड्रॉइड में AsyncTask नहीं है।लाभ से अधिक AsyncTask

rxjava2AsyncTask की तुलना में अलग और कैसे है?

+1

@VygintasB मुझे पूरा यकीन है कि यदि आप उचित रूप से सब्सक्रिप्शन को संभाल नहीं पाते हैं, तो यह मेमोरी लीक दे सकता है, और यह कहने के लिए थोड़ा भ्रामक है कि यह नहीं है, और गलत तुलना है। –

+2

मुझे ओपी के जवाब को कम करने में कोई बिंदु नहीं दिख रहा है। @ बॉबडाल्जिश का जवाब अनियमित भ्रम को कम करने के लिए उठाया जाना चाहिए। – Solidak

उत्तर

12

RxJava "मूल रूप से async ऑपरेशन के लिए" नहीं है। यह इसका एक पहलू है।

  1. आरएक्सजेवा आपको डेटा पर संचालन लिखने की अनुमति देता है, जैसे कि एक ऑपरेशन के आउटपुट को अगले इनपुट के रूप में उपयोग किया जा सकता है। यह धाराओं के कार्यान्वयन के समान ही काम करता है।
  2. आरएक्सजेवा इस कंपोज़ेबिलिटी का उपयोग करता है ताकि कुछ ऑपरेशन बहु-थ्रेडेड वातावरण में हो सकें। यह एकाधिक शेड्यूलर के साथ काम करते समय ऑपरेटरों के लिए अच्छी तरह से परिभाषित अर्थशास्त्र प्रदान करके करता है। कुछ संचालन करने के लिए आरएक्सजेवा asyncTask का उपयोग कर सकते हैं।
  3. RxJava, Flowable जंजीरों का उपयोग करके कुछ अनुप्रयोगों के लिए दबाव आवश्यकताओं वापस का प्रबंधन करता है, जबकि Observable चेन कोई वापस दबाव आवश्यकताओं है। पूर्व उपयुक्त है जहां बफरिंग की आवश्यकता है या गिराए गए सूचना की स्पष्ट स्वीकृति की आवश्यकता है।
  4. आरएक्सजेवा में स्पष्ट त्रुटि और त्रुटि प्रबंधन सेमेन्टिक्स है।

asyncTask बस असीमित कार्यों को संभालता है।

+1

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

2

AsyncTask डेवलपर्स के लिए एंड्रॉइड का डिफ़ॉल्ट टूल है जो यूआई को अवरुद्ध किए बिना यूआई स्क्रीन के संदर्भ में कुछ सरल लंबे समय तक चलने वाले काम करने की आवश्यकता है।

AsyncTask के साथ मुख्य समस्या है:

  • कई वेब सेवा कॉल:

    AsyncTask में इस का समाधान हमारे गतिविधि/टुकड़ा में एक आंतरिक AsyncTask उपवर्ग बनाते हैं, में नेटवर्क कार्रवाई करने के लिए पृष्ठभूमि, और उस ऑपरेशन का नतीजा लें और यूआई को मुख्य धागे में अपडेट करें।

    मेमोरी/संदर्भ लीक आसानी से बनाई गई हैं एक आंतरिक वर्ग है और इस प्रकार बाहरी वर्ग इसके अलावा करने के लिए एक अंतर्निहित संदर्भ, क्या हुआ अगर हम श्रृंखला एक और लंबे आपरेशन करना चाहते हैं रखती है:

    इस दृष्टिकोण कुछ मुद्दों और सीमाएं हैं नेटवर्क कॉल के बाद? हमें दो AsyncTasks घोंसला करना होगा जो पठनीयता को काफी कम कर सकते हैं।

  • त्रुटि निवारण

    कुछ गलत हो जाता है, तो क्या होता है? दुर्भाग्यवश, इसके लिए कोई आउट ऑफ़ द बॉक्स समाधान नहीं है। और डिवाइस रोटेशन जैसी अन्य समस्या, बैक प्रेस हैंडल इत्यादि।

यह सब समस्या नज़र हल करने के लिए RxJava

हैंडल त्रुटि RxJava का उपयोग करने में

इस तरह है:

webService.doSomething(someData) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(
       result -> resultText.setText("It worked!"), 
       e -> handleError(e)); 

दूसरा, कई वेब सेवाओं में कॉल।

public Observable<List<Weather>> getWeatherForLargeUsCapitals() { 
    return cityDirectory.getUsCapitals() 
         .flatMap(cityList -> Observable.from(cityList)) 
         .filter(city -> city.getPopulation() > 500,000) 
         .flatMap(city -> weatherService.getCurrentWeather(city)) //each runs in parallel 
         .toSortedList((cw1,cw2) -> cw1.getCityName().compare(cw2.getCityName())); 
} 

आशा है कि यह आपकी मदद कर सके !!

+0

"डिवाइस रोटेशन, बैक प्रेस हैंडल इत्यादि" से आपका क्या मतलब है। - Asyntask rxjava के बारे में क्या चलते रहते हैं? –

+0

यदि आप RxLifecycle लाइब्रेरी का उपयोग करते हैं तो .compose (bindToLifecycle()) लाइफसाइक्ल कॉलबैक को संभाल लें। –

+0

यह क्या करता है '। (विरोध) bindToLifecycle()) '? क्या यह रोटेशन और बैक प्रेस पर रद्द करता है? –

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