2016-08-29 19 views
5

मुझे कई उदाहरण सामने आए जब लोग मुझे एंड्रॉइड के मानक AsyncTask निर्माण के बजाय आरएक्सजेवा का उपयोग करने के लिए राजी करने की कोशिश कर रहे थे।RxJava?

मेरी राय में आरएक्सजेवा बहुत अधिक सुविधाएं प्रदान करता है लेकिन AsyncTask के खिलाफ सादगी में खो देता है।

क्या कोई उपयोग ऐसे मामले हैं जो एक दृष्टिकोण को दूसरे से बेहतर मानते हैं या इससे भी अधिक सामान्य आरएक्सजेवा को भी बेहतर माना जा सकता है?

+2

मैंने देखा कि यह आलेख बताता है कि, अगर यह मदद करता है। http://blog.feedpresso.com/2016/01/25/why-you-should-use-rxjava-in-android-a-short-introduction-to-rxjava.html – lsiva

+0

धन्यवाद। ऐसा लगता है कि कैसे स्कैला समरूपता को संभाला जाता है। मैं आरएक्सजेवा में उपयोग करने के लिए अपनी परियोजनाओं में कुछ टेस्ट रन करूंगा। हालांकि क्या आपको लगता है कि AsyncTask की कार्यक्षमता के साथ एक मौलिक दोष है? – qantik

उत्तर

10

जब आप जावा 8 पर इसका उपयोग करते हैं तो आरएक्सजेवा की पूरी शक्ति दिखाई देती है, अधिमानतः रेट्रोफिट जैसी लाइब्रेरी के साथ। यह आपको त्रुटि प्रबंधन के पूर्ण नियंत्रण के साथ, एक साथ त्रिकोणीय श्रृंखला संचालन करने की अनुमति देता है। एक पूर्णांक है कि आदेश और apiClient निर्दिष्ट करता है::

apiClient 
.getOrder(id) 
.subscribeOn(Schedulers.io()) 
.flatMapIterable(Order::getLineItems) 
.flatMap(lineItem -> 
    apiClient.getProduct(lineItem.getProductId()) 
      .subscribeOn(Schedulers.io()) 
      .map(product -> product.getCurrentPrice() * lineItem.getCount()), 
    5) 
.reduce((a,b)->a+b) 
.retryWhen((e, count) -> count<2 && (e instanceof RetrofitError)) 
.onErrorReturn(e -> -1) 
.subscribe(System.out::println); 

यह अतुल्यकालिक रूप से एक आदेश की कुल कीमत, निम्नलिखित गुणों के साथ की गणना करेगा: आदेश प्रबंधन microservice के लिए एक रेट्रोफिट ग्राहक उदाहरण के लिए, id दिया निम्नलिखित कोड पर विचार :

  • सबसे 5 किसी एक समय में उड़ान में एपीआई के खिलाफ अनुरोध (और आप सभी अनुरोधों के लिए एक कठिन टोपी के लिए आईओ शेड्यूलर ठीक कर सकते हैं, न सिर्फ एक भी नमूदार श्रृंखला के लिए) पर
  • अप करने के लिए
  • नेटवर्क त्रुटियों के मामले में 2 retries
  • विफलता के मामले में
  • -1 (एक antipattern TBH, लेकिन यह एक अन्य चर्चा है)

इसके अलावा, IMO .subscribeOn(Schedulers.io()) के बाद प्रत्येक नेटवर्क कॉल निहित होना चाहिए - आपको लगता है कि संशोधित करके कैसे आप रेट्रोफिट बनाने कर सकते हैं ग्राहक। कोड की 11 + 2 लाइनों के लिए बुरा नहीं है, भले ही यह एंड्रॉइड-आईएसएच की तुलना में अधिक बैकएंड-आईएसएच है।

+0

इस विस्तृत उदाहरण के लिए आपका बहुत बहुत धन्यवाद। मैं उन प्रथम श्रेणी के कार्यों के साथ टिंकर करने की उम्मीद कर रहा हूं। जावा में लंबे समय तक ऐसा नहीं कर रहा है। – qantik

3

जेक व्हार्टन द्वारा आरएक्सबींडिंग/आरएक्स एंड्रॉइड कुछ अच्छी थ्रेडिंग कार्यक्षमता प्रदान करता है जिसे आप एसिंक कॉल करने के लिए उपयोग कर सकते हैं लेकिन आरएक्सजेवा एसिंक थ्रेडिंग से निपटने की तुलना में अधिक लाभ/कार्यक्षमता प्रदान करता है। उस ने कहा, एक बहुत सीधी सीखने की वक्र (आईएमओ) है। साथ ही, यह ध्यान दिया जाना चाहिए कि AsyncTasks का उपयोग करने में कुछ भी गलत नहीं है, आप केवल आरएक्स (भी, आईएमओ) के साथ अधिक बोलने वाले समाधान लिख सकते हैं।

टीएलडीआर आपको इसका उपयोग करने का प्रयास करना चाहिए। Retrofit और RxJava आपके AsyncTask प्रतिस्थापन उद्देश्यों के लिए अच्छी तरह से मिलकर काम करते हैं।

+0

कूल। तो क्या आप कहेंगे कि AsyncTask एक साधारण HTTP हैंडलर जैसी छोटी परियोजनाओं के लिए ठीक है? – qantik

+0

बिल्कुल, लेकिन आप आरएक्सजेवा/आरएक्सबाइंडिंग/आरएक्स एंड्रॉइड के साथ एक ही चीजों को पूरा कर सकते हैं और आपको ऐसा करने के लिए कुछ अच्छे अंक मिल सकते हैं। –

+0

बहुत अच्छा। मैं हमेशा लालित्य की तलाश में हूं। ;-) – qantik