RxJava ऑब्जर्वेबल का उपयोग कब करना चाहिए और एंड्रॉइड पर साधारण कॉलबैक कब करना चाहिए?


260

मैं अपने ऐप के लिए नेटवर्किंग पर काम कर रहा हूं। इसलिए मैंने स्क्वायर के रेट्रोफिट को आजमाने का फैसला किया । मैं देखता हूं कि वे सरल समर्थन करते हैंCallback

@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);

और RxJava की Observable

@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);

दोनों पहली नज़र में काफी हद तक एक जैसे दिखते हैं, लेकिन जब इसे लागू किया जाता है तो यह दिलचस्प हो जाता है ...

जबकि साधारण कॉलबैक कार्यान्वयन इस के समान होगा:

api.getUserPhoto(photoId, new Callback<Photo>() {
    @Override
    public void onSuccess() {
    }
});

जो काफी सरल और सीधा है। और इसके साथ Observableजल्दी से क्रिया और काफी जटिल हो जाता है।

public Observable<Photo> getUserPhoto(final int photoId) {
    return Observable.create(new Observable.OnSubscribeFunc<Photo>() {
        @Override
        public Subscription onSubscribe(Observer<? super Photo> observer) {
            try {
                observer.onNext(api.getUserPhoto(photoId));
                observer.onCompleted();
            } catch (Exception e) {
                observer.onError(e);
            }

            return Subscriptions.empty();
        }
    }).subscribeOn(Schedulers.threadPoolForIO());
}

और वह यह नहीं है। आपको अभी भी कुछ इस तरह करना है:

Observable.from(photoIdArray)
        .mapMany(new Func1<String, Observable<Photo>>() {
            @Override
            public Observable<Photo> call(Integer s) {
                return getUserPhoto(s);
            }
        })
        .subscribeOn(Schedulers.threadPoolForIO())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<Photo>() {
            @Override
            public void call(Photo photo) {
                //save photo?
            }
        });

क्या मुझसे कोई चूक हो रही है? या यह Observableएस का उपयोग करने के लिए एक गलत मामला है ? कब / एक को Observableसाधारण कॉलबैक पर पसंद करना चाहिए ?

अपडेट करें

ऊपर दिए गए उदाहरण के मुकाबले रेट्रोफिट का उपयोग करना बहुत आसान है क्योंकि @ नील्स ने अपने जवाब में या जेक व्हार्टन के उदाहरण प्रोजेक्ट 2020 में दिखाया । लेकिन अनिवार्य रूप से सवाल वही रहता है - जब एक तरह से या दूसरे का उपयोग करना चाहिए?


क्या आप U2020 के बारे में बात कर रहे फ़ाइल के लिए अपने लिंक को अपडेट कर सकते हैं
लेटर करें

यह अभी भी काम कर रहा है ...
मार्टिनस जर्कस

4
जब मैं RxJava पढ़ रहा था, ठीक उसी समय मैन मेरे पास एक ही विचार था। मैंने एक साधारण अनुरोध के लिए एक रेट्रोफिट उदाहरण (क्योंकि मैं इससे बहुत परिचित हूं) पढ़ा और यह कोड की दस या पंद्रह लाइनें थी और मेरी पहली प्रतिक्रिया थी कि आप मुझसे मजाक कर रहे हैं = /। मैं यह भी पता नहीं लगा सकता कि यह एक इवेंट बस की जगह कैसे लेती है, क्योंकि इवेंट बस आपको अवलोकनीय और rxjava से अलग कर देती है, जब तक कि मैं गलत नहीं हूँ, तब तक युग्मन को पुन: प्रस्तुत करता है।
लो-टैन

जवाबों:


348

सरल नेटवर्किंग सामान के लिए, कॉलबैक पर आरएक्सजाव के फायदे बहुत सीमित हैं। सरल getUserPhoto उदाहरण:

RxJava:

api.getUserPhoto(photoId)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Photo>() {
            @Override
            public void call(Photo photo) {
               // do some stuff with your photo 
            }
     });

वापस कॉल करें:

api.getUserPhoto(photoId, new Callback<Photo>() {
    @Override
    public void onSuccess(Photo photo, Response response) {
    }
});

RxJava वैरिएंट Callback वैरिएंट से ज्यादा बेहतर नहीं है। अभी के लिए, आइए त्रुटि से निपटने की उपेक्षा करें। आइए तस्वीरों की एक सूची लेते हैं:

RxJava:

api.getUserPhotos(userId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<List<Photo>, Observable<Photo>>() {
    @Override
    public Observable<Photo> call(List<Photo> photos) {
         return Observable.from(photos);
    }
})
.filter(new Func1<Photo, Boolean>() {
    @Override
    public Boolean call(Photo photo) {
         return photo.isPNG();
    }
})
.subscribe(
    new Action1<Photo>() {
    @Override
        public void call(Photo photo) {
            list.add(photo)
        }
    });

वापस कॉल करें:

api.getUserPhotos(userId, new Callback<List<Photo>>() {
    @Override
    public void onSuccess(List<Photo> photos, Response response) {
        List<Photo> filteredPhotos = new ArrayList<Photo>();
        for(Photo photo: photos) {
            if(photo.isPNG()) {
                filteredList.add(photo);
            }
        }
    }
});

अब, RxJava वैरिएंट अभी भी छोटा नहीं है, हालांकि लैम्बडा के साथ यह कॉलबैक वेरिएंट के करीब होगा। इसके अलावा, यदि आपके पास JSON फ़ीड तक पहुँच है, तो सभी फ़ोटो पुनः प्राप्त करने के लिए यह अजीब तरह का होगा जब आप केवल PNG प्रदर्शित कर रहे हों। बस फ़ीड को इसमें समायोजित करें केवल पीएनजी प्रदर्शित करता है।

पहला निष्कर्ष

जब आप एक साधारण JSON लोड कर रहे होते हैं, जिसे आप सही प्रारूप में तैयार करते हैं तो यह आपके कोडबेस को छोटा नहीं बनाता है।

अब, चीजों को थोड़ा और दिलचस्प बनाते हैं। मान लें कि आप न केवल उपयोगकर्ता फोटो को पुनः प्राप्त करना चाहते हैं, बल्कि आपके पास एक इंस्टाग्राम-क्लोन है, और आप 2 JSONs को पुनः प्राप्त करना चाहते हैं: 1. getUserDetails () 2. getUserPhotos ()

आप इन दो JSON को समानांतर में लोड करना चाहते हैं, और जब दोनों लोड होते हैं, तो पृष्ठ प्रदर्शित किया जाना चाहिए। कॉलबैक संस्करण थोड़ा और कठिन हो जाएगा: आपको 2 कॉलबैक बनाने होंगे, डेटा को गतिविधि में संग्रहीत करना होगा, और यदि सभी डेटा लोड किया गया है, तो पृष्ठ प्रदर्शित करें:

वापस कॉल करें:

api.getUserDetails(userId, new Callback<UserDetails>() {
    @Override
    public void onSuccess(UserDetails details, Response response) {
        this.details = details;
        if(this.photos != null) {
            displayPage();
        }
    }
});

api.getUserPhotos(userId, new Callback<List<Photo>>() {
    @Override
    public void onSuccess(List<Photo> photos, Response response) {
        this.photos = photos;
        if(this.details != null) {
            displayPage();
        }
    }
});

RxJava:

private class Combined {
    UserDetails details;
    List<Photo> photos;
}


Observable.zip(api.getUserDetails(userId), api.getUserPhotos(userId), new Func2<UserDetails, List<Photo>, Combined>() {
            @Override
            public Combined call(UserDetails details, List<Photo> photos) {
                Combined r = new Combined();
                r.details = details;
                r.photos = photos;
                return r;
            }
        }).subscribe(new Action1<Combined>() {
            @Override
            public void call(Combined combined) {
            }
        });

हम कहीं मिल रहे हैं! RxJava का कोड अब कॉलबैक विकल्प जितना बड़ा है। RxJava कोड अधिक मजबूत है; सोचिए अगर हमें लोड किए जाने वाले तीसरे JSON (नवीनतम वीडियो की तरह) की आवश्यकता हो, तो क्या होगा? RxJava को केवल एक छोटे समायोजन की आवश्यकता होगी, जबकि कॉलबैक संस्करण को कई स्थानों पर समायोजित करने की आवश्यकता है (प्रत्येक कॉलबैक पर हमें यह जांचने की आवश्यकता है कि क्या सभी डेटा पुनर्प्राप्त किए गए हैं)।

एक और उदाहरण; हम एक स्वत: पूर्ण फ़ील्ड बनाना चाहते हैं, जो रेट्रोफ़िट का उपयोग करके डेटा लोड करता है। जब भी एक EditText में TextChangedEvent होता है, हम हर बार एक वेबकॉल नहीं करना चाहते हैं। तेजी से टाइप करते समय, केवल अंतिम तत्व को कॉल ट्रिगर करना चाहिए। RxJava पर हम डेब्यू ऑपरेटर का उपयोग कर सकते हैं:

inputObservable.debounce(1, TimeUnit.SECONDS).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // use Retrofit to create autocompletedata
            }
        });

मैं कॉलबैक संस्करण नहीं बनाऊंगा, लेकिन आप समझेंगे कि यह बहुत अधिक काम है।

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


6
आपने किस वर्ग के लिए उपयोग किया inputObservable? मुझे बहस करने में बहुत समस्याएँ हैं और मैं इस समाधान के बारे में थोड़ा और सीखना चाहूंगा।
मिगोर

@Migore RxBinding परियोजना "मंच बाइंडिंग" मॉड्यूल की तरह कक्षाओं में प्रावधान है कि है RxView, RxTextViewआदि के लिए इस्तेमाल किया जा सकता inputObservable
बर्फ़ीला तूफ़ान

@ नील्स आप बता सकते हैं कि एरर हैंडलिंग को कैसे जोड़ा जाए? यदि आप फ्लैटपूल, फ़िल्टर और फिर सदस्यता लेते हैं, तो क्या आप ऑन-लाईन, ऑनर्र और ऑनक्नेक् के साथ एक ग्राहक बना सकते हैं? इतनी बड़ी व्याख्या के लिए आपका बहुत-बहुत धन्यवाद।
निकोलस जाफेल

4
यह एक बहुत बढ़िया उदाहरण है!
ये लिन आंग

3
सबसे अच्छा स्पष्टीकरण कभी!
डेनिस नेक

66

वेधनीय सामान पहले से ही रेट्रोफिट में किया गया है, इसलिए कोड यह हो सकता है:

api.getUserPhoto(photoId)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Photo>() {
         @Override
            public void call(Photo photo) {
                //save photo?
            }
     });

5
हां, लेकिन सवाल यह है कि एक से दूसरे को तरजीह कब दें?
क्रिस्टोफर पेरी

7
तो यह साधारण कॉलबैक से बेहतर कैसे है?
मार्टिनस जर्कस

14
यदि आप कई फ़ंक्शन को चेन करना चाहते हैं तो @MartynasJurkus वेधशालाएँ उपयोगी हो सकती हैं। उदाहरण के लिए, कॉल करने वाला एक फोटो प्राप्त करना चाहता है जो 100x100 आयामों के लिए क्रॉप किया जाता है। एपीआई किसी भी आकार की तस्वीर वापस कर सकता है, इसलिए आप getUserPhoto को अन्य ResizedPhotoObservable के लिए अवलोकन योग्य मैप कर सकते हैं - कॉल करने वाले को केवल सूचित किया जाता है जब आकार बदल दिया जाता है। यदि आपको इसका उपयोग करने की आवश्यकता नहीं है, तो इसे बाध्य न करें।
ataulm

2
एक छोटी सी प्रतिक्रिया। कॉल करने की कोई आवश्यकता नहीं है .subscribeOn (Schedulers.io ()) क्योंकि रेट्रोफिट पहले से ही इस बात का ध्यान रखता है - github.com/square/retrofit/issues/430 (जेक का जवाब देखें)
hiRrianLee

4
@MartynasJurkus अतिरिक्त रूप से अताउल्म द्वारा कहे गए सामानों के विपरीत, इससे Callbackआप अनसब्सक्राइब कर सकते हैं Observeable, इसलिए आम जीवनचक्र की समस्याओं से बच सकते हैं ।
दिमित्री ज़ेत्सेव

35

GetUserPhoto () के मामले में RxJava के फायदे बहुत अच्छे नहीं हैं। लेकिन चलो एक और उदाहरण लेते हैं जब आप एक उपयोगकर्ता के लिए सभी फ़ोटो प्राप्त करेंगे, लेकिन केवल जब छवि PNG है, और आपके पास JSON तक पहुंच नहीं है, तो आप सर्वर पर फ़िल्टरिंग कर सकते हैं।

api.getUserPhotos(userId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<List<Photo>, Observable<Photo>>() {
    @Override
    public Observable<Photo> call(List<Photo> photos) {
         return Observable.from(photos);
    }
})
.filter(new Func1<Photo, Boolean>() {
    @Override
    public Boolean call(Photo photo) {
         return photo.isPNG();
    }
})
.subscribe(
    new Action1<Photo>() {
    @Override
        public void call(Photo photo) {
            // on main thread; callback for each photo, add them to a list or something.
            list.add(photo)
        }
    }, 
    new Action1<Throwable>() {
    @Override
        public void call(Throwable throwable) {
            // on main thread; something went wrong
            System.out.println("Error! " + throwable);
        }
    }, 
    new Action0() {
        @Override
        public void call() {
            // on main thread; all photo's loaded, time to show the list or something.
        }
    });

अब JSON ने फोटो की एक सूची दी है। हम उन्हें अलग-अलग मदों के लिए फ्लैटबेल करेंगे। ऐसा करने से, हम उन फ़ोटो को अनदेखा करने के लिए फ़िल्टर विधि का उपयोग करने में सक्षम होंगे जो PNG नहीं हैं। उसके बाद, हम सब्सक्राइब करेंगे, और प्रत्येक व्यक्ति के लिए एक कॉलबैक, एक एररहैंडलर और एक कॉलबैक प्राप्त करेंगे जब सभी पंक्तियों को पूरा कर लिया गया है।

टीएलडीआर प्वाइंट यहां होना; कॉलबैक आपको केवल सक्सेस और असफलता के लिए कॉलबैक लौटाता है; RxJava वेधशाला आपको मानचित्र, कम करने, फ़िल्टर करने और कई अन्य सामान करने की अनुमति देती है।


सबस्क्राइब के साथ सबसे पहले सबऑनऑन और ओवरवॉच आवश्यक नहीं है। यह नेटवर्क कॉल को एसिंक्रोनस रूप से करेगा और कॉलर के समान थ्रेड पर सूचित करेगा। जब आप रेट्रोबलाडा जोड़ते हैं और साथ ही लैम्ब्डा एक्सप्रेशन प्राप्त करते हैं तो यह बहुत अच्छा हो जाता है।

लेकिन मैं यह कर सकता हूं (फ़िल्टर छवि PNG है) .subscribe () मुझे फ़िल्टर का उपयोग क्यों करना चाहिए? और फ्लैटमैप में कोई ज़रूरत नहीं है
SERG

3
3 उत्तर @ नील्स से। पहले वाला सवाल का जवाब देता है। 2 के लिए कोई लाभ नहीं
रेमंड चेनन

वही जवाब
मयंक शर्मा

27

Rxjava के साथ आप कम कोड वाली और चीजें कर सकते हैं।

मान लेते हैं कि आप अपने ऐप में त्वरित खोज को लागू करना चाहते हैं। कॉलबैक के साथ आप पिछले अनुरोध को अनसब्सक्राइब करने और नए को सब्सक्राइब करने के बारे में चिंतित हैं, ओरिएंटेशन को स्वयं हैंडल करें ... मुझे लगता है कि यह बहुत कोड और बहुत अधिक क्रिया है।

Rxjava के साथ बहुत सरल है।

public class PhotoModel{
  BehaviorSubject<Observable<Photo>> subject = BehaviorSubject.create(...);

  public void setUserId(String id){
   subject.onNext(Api.getUserPhoto(photoId));
  }

  public Observable<Photo> subscribeToPhoto(){
    return Observable.switchOnNext(subject);
  }
}

यदि आप तत्काल खोज को लागू करना चाहते हैं तो आपको केवल TextChangeListener के लिए सुनना होगा और कॉल करना होगा photoModel.setUserId(EditText.getText());

Fragment या गतिविधि के ऑनक्रिएट मेथड में आप PhotoModel.subscribeToPhoto () रिटर्न करने वाले ऑब्जर्वेबल को सब्सक्राइब करते हैं, यह एक ऑब्जर्वेबल रिटर्न देता है जो हमेशा लेटेस्ट ऑब्जर्वेबल (रिक्वेस्ट) द्वारा उत्सर्जित आइटम को निकालता है।

AndroidObservable.bindFragment(this, photoModel.subscribeToPhoto())
                 .subscribe(new Action1<Photo>(Photo photo){
      //Here you always receive the response of the latest query to the server.
                  });

उदाहरण के लिए, यदि PhotoModel एक सिंगलटन है, तो आपको ओरिएंटेशन परिवर्तनों के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि जब आप सदस्यता लेते हैं, तो BehaviorSubject अंतिम सर्वर प्रतिक्रिया का उत्सर्जन करता है।

कोड की इस पंक्तियों के साथ हमने एक त्वरित खोज और हैंडल ओरिएंटेशन परिवर्तनों को लागू किया है। क्या आपको लगता है कि आप इसे कम कोड वाले कॉलबैक के साथ लागू कर सकते हैं? मुझे शक है।


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

2

हम आमतौर पर निम्नलिखित तर्क के साथ जाते हैं:

  1. यदि यह एक सरल-प्रतिक्रिया कॉल है, तो कॉलबैक या भविष्य बेहतर है।
  2. यदि यह कई प्रतिक्रियाओं (स्ट्रीम) के साथ एक कॉल है, या जब अलग-अलग कॉल के बीच जटिल बातचीत होती है (@Niels का जवाब देखें ), तो वेधशालाएं बेहतर हैं।

1

अन्य उत्तरों में नमूनों और निष्कर्षों से, मुझे लगता है कि सरल एक या दो चरणों वाले कार्यों के लिए कोई बड़ा अंतर नहीं है। हालाँकि, कॉलबैक सरल और सीधा है। RxJava सरल कार्य के लिए अधिक जटिल और बहुत बड़ा है। तीसरा उपाय है: अबेकसुटिल । मुझे सभी तीन समाधानों के साथ उपरोक्त उपयोग के मामलों को लागू करने दें: कॉलबैक, आरएक्सजाव, कंप्लीटटेबल सिवनी (एबाकुस यूटिल) रेट्रोलंबा के साथ :

नेटवर्क से फ़ोटो प्राप्त करें और डिवाइस पर सहेजें / प्रदर्शित करें:

// By Callback
api.getUserPhoto(userId, new Callback<Photo>() {
    @Override
    public void onResponse(Call<Photo> call, Response<Photo> response) {
        save(response.body()); // or update view on UI thread.
    }

    @Override
    public void onFailure(Call<Photo> call, Throwable t) {
        // show error message on UI or do something else.
    }
});

// By RxJava
api.getUserPhoto2(userId) //
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(photo -> {
            save(photo); // or update view on UI thread.
        }, error -> {
            // show error message on UI or do something else.
        });

// By Thread pool executor and CompletableFuture.
TPExecutor.execute(() -> api.getUserPhoto(userId))
        .thenRunOnUI((photo, error) -> {
            if (error != null) {
                // show error message on UI or do something else.
            } else {
                save(photo); // or update view on UI thread.
            }
        });

उपयोगकर्ता विवरण और फोटो को समानांतर में लोड करें

// By Callback
// ignored because it's little complicated

// By RxJava
Observable.zip(api.getUserDetails2(userId), api.getUserPhoto2(userId), (details, photo) -> Pair.of(details, photo))
        .subscribe(p -> {
            // Do your task.
        });

// By Thread pool executor and CompletableFuture.
TPExecutor.execute(() -> api.getUserDetails(userId))
          .runOnUIAfterBoth(TPExecutor.execute(() -> api.getUserPhoto(userId)), p -> {
    // Do your task
});

4
ओपी
forresthopkinsa

1

मैं व्यक्तिगत रूप से उन मामलों में एपीआई प्रतिक्रियाओं को प्राप्त करने के लिए आरएक्स का उपयोग करना पसंद करता हूं जो मुझे फ़िल्टर, मानचित्र या ऐसा कुछ करना है जो डेटा पर है या उन मामलों में जिन्हें मुझे पिछले कॉल प्रतिक्रियाओं के आधार पर एक और एपीआई कॉल करना है


0

ऐसा लगता है कि आप पहिया को फिर से मजबूत कर रहे हैं, आप जो कर रहे हैं वह पहले से ही रेट्रोफिट में लागू है।

एक उदाहरण के लिए, आप रेट्रोफिट के रेस्टएडस्केपटेस्ट.जावा को देख सकते हैं , जहां वे ऑब्जर्वेबल के साथ एक इंटरफेस को रिटर्न टाइप के रूप में परिभाषित करते हैं , और फिर उसका उपयोग करते हैं


जवाब के लिए धन्यवाद। मैं देखता हूं कि आप क्या कह रहे हैं लेकिन मुझे यकीन नहीं है कि मैं इसे कैसे लागू करूंगा। क्या आप मौजूदा रेट्रोफिट कार्यान्वयन का उपयोग करके एक सरल उदाहरण प्रदान कर सकते हैं ताकि मैं आपको इनाम दे सकूं?
येह्सफ

@ यिशोसे किसी ने उनकी टिप्पणी को हटा दिया या आप ओपी होने का नाटक कर रहे थे? ))
फरीद

आप किसी और के सवाल पर इनाम दे सकते हैं। जब मैंने यह पूछा, तो मुझे वास्तव में प्रश्न के उत्तर की आवश्यकता थी - इसलिए मैंने एक इनाम की पेशकश की। यदि आप इनाम के पुरस्कार पर मंडराते हैं, तो आप देखेंगे कि यह मेरे द्वारा सम्मानित किया गया था।
येहोसफ

0

जब आप मज़े, एक पालतू प्रोजेक्ट, या एक POC या 1 प्रोटोटाइप के लिए एक ऐप बना रहे हैं, तो आप सरल कोर एंड्रॉइड / जावा क्लासेस जैसे कॉलबैक, एसिंक्स टास्क, लूपर्स, थ्रेड्स इत्यादि का उपयोग करते हैं। वे उपयोग करने के लिए सरल हैं और किसी की आवश्यकता नहीं है 3 पार्टी का पार्टी एकीकरण। एक छोटे से समय की अपरिवर्तनीय परियोजना के निर्माण के लिए एक बड़ा पुस्तकालय एकीकरण अतार्किक है जब कुछ इसी तरह के बल्ले से किया जा सकता है।

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

दूसरी ओर, उत्पादन-तैयार समवर्ती कोड को लिखने में मदद करने के लिए RxJava, Co-routines इत्यादि संगोष्ठी पुस्तकालयों की कोशिश की जाती है और एक बार में परीक्षण किया जाता है। अब फिर से, यह नहीं है कि इन पुस्तकालयों का उपयोग करके आप समवर्ती कोड नहीं लिख रहे हैं या सभी समसामयिक तर्क को दूर कर रहे हैं। तुम अभी तक। लेकिन अब, यह दिखाई दे रहा है और कोडबेस में समवर्ती कोड लिखने के लिए एक स्पष्ट पैटर्न लागू करता है और आपकी विकास टीम में अधिक महत्वपूर्ण है।

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


TL'DR

यदि आप पहले से ही कोड बेस में समवर्ती कोडिंग के लिए RxJava का उपयोग कर रहे हैं, तो बस RxJava ऑब्जर्वेबल / फ़्लोएबल का उपयोग करें। तब पूछने के लिए एक बुद्धिमान प्रश्न क्या मुझे वेधशालाओं से फ़्लायवेबल्स तक का उपयोग करना चाहिए। यदि नहीं, तो आगे बढ़ो और एक कॉल करने योग्य का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.