কারও কখন আরএক্সজাভা পর্যবেক্ষণযোগ্য এবং কখন অ্যান্ড্রয়েডে সহজ কলব্যাক ব্যবহার করা উচিত?


260

আমি আমার অ্যাপ্লিকেশনটির জন্য নেটওয়ার্কিংয়ে কাজ করছি। তাই আমি স্কয়ারের রেট্রোফিট চেষ্টা করে দেখার সিদ্ধান্ত নিয়েছি । আমি দেখতে পাচ্ছি যে তারা সহজ সমর্থন করেCallback

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

আর আর এক্স জাভা এর 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সহজ কলব্যাকের চেয়ে বেশি পছন্দ করতে পারে ?

হালনাগাদ

রেট্রোফিট ব্যবহার করে উপরে উল্লেখিত হিসাবে @Niels তার উত্তর অথবা জেক হোয়ারটন উদাহরণ প্রকল্পে দেখিয়েছেন উদাহরণ চেয়ে অনেক সহজ U2020 । তবে মূলত প্রশ্নটি একই থাকে - যখন এক সাথে বা অন্যভাবে ব্যবহার করা উচিত?


আপনি যে ফাইলটি U2020 এ কথা বলছেন তার লিঙ্কটি আপডেট করতে পারেন
লিটারল করুন

এটি এখনও কাজ করছে ...
মার্টিনাস জুরকাস

4
আমি যখন আরএক্সজাভা পড়ছিলাম তখন আমার ঠিক একই ধারণা ছিল। আমি একটি সাধারণ অনুরোধের একটি retrofit উদাহরণ (কারণ আমি এটির সাথে অত্যন্ত পরিচিত) পড়েছিলাম এবং এটি কোডের দশ বা পনেরটি লাইন ছিল এবং আমার প্রথম প্রতিক্রিয়া হ'ল আপনি আমাকে মজা করছেন = =। আমি বুঝতে পারি না কীভাবে এটি একটি ইভেন্টের বাসের স্থলাভিষিক্ত হয়, কারণ ইভেন্ট বাস আপনাকে পর্যবেক্ষণযোগ্য থেকে ডিউপল করে এবং রেক্সজভা কাপলিংয়ের পুনঃপ্রবর্তন করে, যদি আমার ভুল না হয়।
লো-টান

উত্তর:


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:

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);
            }
        }
    }
});

এখন, আরএক্সজাভা ভেরিয়েন্টটি এখনও ছোট নয়, যদিও ল্যাম্বডাসের সাথে এটি কলব্যাক বৈকল্পিকের আরও নিকটবর্তী হবে। তদুপরি, আপনার যদি জেএসওএন ফিডে অ্যাক্সেস থাকে তবে আপনি যখন কেবল পিএনজি প্রদর্শন করছেন তখন সমস্ত ফটোগুলি পুনরুদ্ধার করা এক ধরণের উদ্ভট বিষয় হবে। এটিতে ফিডটি সামঞ্জস্য করুন কেবলমাত্র পিএনজি দেখায়।

প্রথম উপসংহার

আপনি সঠিক ফর্ম্যাটে থাকতে প্রস্তুত একটি সাধারণ জেএসওএন লোড করার সময় এটি আপনার কোডবেসকে ছোট করে না।

এখন, আসুন বিষয়গুলিকে কিছুটা আকর্ষণীয় করে তুলি। ধরা যাক আপনি কেবল ব্যবহারকারী ফটোটি পুনরুদ্ধার করতে চান না, তবে আপনার একটি ইনস্টাগ্রাম-ক্লোন রয়েছে এবং আপনি 2 জেএসএনএস পুনরুদ্ধার করতে চান: 1. getUserDetails () 2. getUserPhotos ()

আপনি এই দুটি JSON গুলি সমান্তরালভাবে লোড করতে চান এবং উভয়ই লোড হওয়ার পরে পৃষ্ঠাটি প্রদর্শিত হবে should কলব্যাক বৈকল্পিকটি আরও কিছুটা কঠিন হয়ে উঠবে: আপনাকে 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) {
            }
        });

আমরা কোথাও পাচ্ছি! আরএক্সজাভা কোডটি এখন কলব্যাক বিকল্প হিসাবে বড়। আরএক্সজাভা কোডটি আরও শক্তিশালী; আমাদের যদি তৃতীয় জেএসওন লোড করার জন্য (সর্বশেষ ভিডিওগুলির মতো) দরকার হয় তবে কী হবে? আরএক্সজাভা কেবলমাত্র একটি ছোট সামঞ্জস্য প্রয়োজন, যখন কলব্যাক বৈকল্পিক একাধিক জায়গায় সামঞ্জস্য করা প্রয়োজন (প্রতিটি কলব্যাকে আমাদের সমস্ত ডেটা পুনরুদ্ধার করা হয়েছে কিনা তা খতিয়ে দেখা উচিত)।

আরেকটি উদাহরণ; আমরা একটি স্ব-পরিপূর্ণ ক্ষেত্র তৈরি করতে চাই, যা retrofit ব্যবহার করে ডেটা লোড করে। আমরা যখনই একটি সম্পাদনা পাঠ্য পাঠ্য চ্যাঞ্জড এভেন্টে প্রতিবার ওয়েবক্যাল করতে চাই না। দ্রুত টাইপ করার সময়, শুধুমাত্র শেষ উপাদানটির কলটি ট্রিগার করা উচিত। আরএক্স জাভাতে আমরা ডিবন অপারেটরটি ব্যবহার করতে পারি:

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

আমি কলব্যাক বৈকল্পিক তৈরি করব না তবে আপনি বুঝতে পারবেন এটি আরও বেশি কাজ।

উপসংহার: ডেটা প্রবাহ হিসাবে প্রেরণ করা হলে RxJava ব্যতিক্রমীভাবে ভাল is রিট্রোফিট পর্যবেক্ষণযোগ্য একইসাথে স্ট্রিমের সমস্ত উপাদানকে ধাক্কা দেয়। কলব্যাকের তুলনায় এটি নিজের মধ্যে বিশেষভাবে কার্যকর নয়। তবে যখন স্ট্রিম এবং বিভিন্ন সময়ে একাধিক উপাদান পুশ হয় এবং আপনার সময় সম্পর্কিত-জিনিসাদি করা দরকার হয়, তখন আরএক্সজাভা কোডটিকে অনেক বেশি রক্ষণাবেক্ষণ করে তোলে।


6
আপনি কোন শ্রেণীর জন্য ব্যবহার করেছেন inputObservable? ডিবাউনিং করে আমার অনেক সমস্যা আছে এবং এই সমাধান সম্পর্কে আরও কিছুটা জানতে চাই।
মিগোর

@Migore RxBinding প্রকল্প "প্ল্যাটফর্ম বাঁধাই" মডিউল মত শ্রেণীর প্রদান করে যে হয়েছে RxView, RxTextViewইত্যাদি যে জন্য ব্যবহার করা যেতে পারে inputObservable
বরফখণ্ড

@ নিলস কীভাবে ত্রুটি পরিচালনা পরিচালনা করতে পারবেন? আপনি ফ্ল্যাটম্যাপ, ফিল্টার করে সাবস্ক্রাইব করলে অন কমপ্লিটড, অনআরআর এবং অনেক্সট দিয়ে গ্রাহক তৈরি করতে পারেন? আপনার বড় ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ।
নিকোলাস জাফল

4
এটি একটি ভয়ঙ্কর উদাহরণ!
ইয়ে লিন অং

3
সর্বকালের সেরা ব্যাখ্যা!
ডেনিস নেক

66

পর্যবেক্ষণযোগ্য স্টাফগুলি ইতিমধ্যে retrofit এ সম্পন্ন হয়েছে, তাই কোডটি এটি হতে পারে:

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

5
হ্যাঁ, তবে প্রশ্ন হচ্ছে কখন একজনকে অপরটির চেয়ে পছন্দ করবেন?
ক্রিস্টোফার পেরি

7
তাহলে এটি কীভাবে সহজ কলব্যাকের চেয়ে ভাল?
মার্টিনাস জুরকাস

14
আপনি বেশ কয়েকটি ফাংশন শৃঙ্খল করতে চাইলে @ মার্টিনাস জুরকাস পর্যবেক্ষণগুলি কার্যকর হতে পারে। উদাহরণস্বরূপ, কলার এমন একটি ফটো পেতে চান যা 100x100 মাত্রায় ফসলযুক্ত। এপিআই কোনও আকারের ছবি ফিরিয়ে দিতে পারে, যাতে আপনি অন্য রেজাইজডফোটো অবজারভেবলের কাছে পর্যবেক্ষণযোগ্য গেট ইউজারফোটোকে মানচিত্র করতে পারেন - পুনরায় আকার দেওয়ার পরে কলকারী কেবলমাত্র বিজ্ঞপ্তি পায়। আপনার যদি এটি ব্যবহার করার দরকার না হয় তবে জোর করে চাপিয়ে দেবেন না।
আতাউলম

2
একটি ছোটখাট প্রতিক্রিয়া। রেট্রোফিট ইতিমধ্যে এটির যত্ন নিচ্ছে বলে। সাবস্ক্রাইব ওনে (শিডিয়ুলার.ইও ()) কল করার দরকার নেই - github.com/square/retrofit/issues/430 (জ্যাকের জবাব দেখুন)
হাইব্রায়ানলি

4
@ মার্টিনাস জুরকাস অতিরিক্তভাবে আতাউলমের দ্বারা বলা সামগ্রীতে বলা হয়েছে যে, Callbackআপনি এর থেকে সাবস্ক্রাইব করতে পারবেন না Observeable, তাই সাধারণ জীবনচক্র সমস্যাগুলি এড়িয়ে চলে।
দিমিত্রি জায়েতসেভ

35

GetUserPhoto () এর ক্ষেত্রে 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) {
            // 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.
        }
    });

এখন জেএসএন ফটো'র একটি তালিকা ফিরিয়ে দেয়। আমরা এগুলি পৃথক আইটেমগুলিতে ফ্ল্যাটম্যাপ করব। এটি করার মাধ্যমে, আমরা পিএনজি নয় এমন ফটোগুলি উপেক্ষা করার জন্য ফিল্টার পদ্ধতিটি ব্যবহার করতে সক্ষম হব। এর পরে, আমরা সাবস্ক্রাইব করব এবং প্রতিটি স্বতন্ত্র ফটোগুলির জন্য একটি কলব্যাক, একটি ত্রুটিহ্যান্ডলার এবং সমস্ত সারি সমাপ্ত হয়ে গেলে একটি কলব্যাক পাব।

এখানে টিএলডিআর পয়েন্ট রয়েছে; কলব্যাক কেবল সাফল্য এবং ব্যর্থতার জন্য আপনাকে একটি কলব্যাক দেয়; আরএক্সজাভা পর্যবেক্ষণ আপনাকে মানচিত্র, হ্রাস, ফিল্টার এবং আরও অনেক কিছু করতে দেয়।


প্রথমে সাবস্ক্রাইব অন এবং পর্যবেক্ষণের জন্য পুনঃপ্রদানের সাথে প্রয়োজনীয় নয়। এটি নেটওয়ার্ক কলটি সংযোজনীয়ভাবে করবে এবং কলারের মতো একই থ্রেডে অবহিত করবে। ল্যাম্বডা এক্সপ্রেশন পেতে আপনি রেট্রোলেম্বদা যুক্ত করার সময় এটি আরও সুন্দর হয়ে ওঠে।

তবে আমি এটি করতে পারি (ফিল্টার চিত্রটি পিএনজি হয়)। সাবস্ক্রাইব () এ আমার কেন ফিল্টার ব্যবহার করা উচিত? এবং flatmap মধ্যে কোন প্রয়োজন নেই
SERG

3
@ নীল থেকে 3 টি উত্তর। প্রথমটি প্রশ্নের উত্তর দেয়। ২ য়
রেমন্ড চেনন

প্রথম হিসাবে একই উত্তর
মায়াঙ্ক শর্মা

27

আরএক্সজাভা দিয়ে আপনি কম কোড দিয়ে আরও কাজ করতে পারেন।

আসুন ধরে নেওয়া যাক আপনি আপনার অ্যাপে তাত্ক্ষণিক অনুসন্ধান প্রয়োগ করতে চান। কলব্যাকের সাহায্যে আপনি পূর্ববর্তী অনুরোধটি বাতিল করতে এবং নতুনটির সাবস্ক্রাইব করার বিষয়ে উদ্বিগ্ন হয়ে আছেন, পরিচালনা ওরিয়েন্টেশনটি নিজেকে পরিবর্তন করুন ... আমি মনে করি এটি প্রচুর কোড এবং খুব ভার্বোস।

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);
  }
}

আপনি যদি তাত্ক্ষণিক অনুসন্ধানের প্রয়োগ করতে চান তবে আপনাকে কেবলমাত্র টেক্সট চ্যাঞ্জলিস্টনার শুনতে হবে এবং কল করতে হবে photoModel.setUserId(EditText.getText());

টুকরা বা ক্রিয়াকলাপের অনক্রিয়া পদ্ধতিতে আপনি যে পর্যবেক্ষণে ফটোমোডেল.সুবস্ক্রাইব টোফোটো () প্রত্যাবর্তন করে সেটিতে এটি সাবস্ক্রাইব করে যা সর্বদা সর্বশেষ পর্যবেক্ষণযোগ্য (অনুরোধ) দ্বারা প্রকাশিত আইটেমগুলি সর্বদা নির্গত করে।

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

এছাড়াও, উদাহরণস্বরূপ, যদি ফটোমোডেল সিঙ্গলটন হয় তবে আপনাকে ওরিয়েন্টেশন পরিবর্তনের বিষয়ে চিন্তা করার দরকার নেই, কারণ আপনি যখন সাবস্ক্রাইব করেন তা নির্বিশেষে বিহেভিয়ারসুব্যাক্ট সর্বশেষ সার্ভারের প্রতিক্রিয়া প্রকাশ করে।

কোডের এই লাইনের সাহায্যে আমরা তাত্ক্ষণিক অনুসন্ধান এবং হ্যান্ডেল ওরিয়েন্টেশন পরিবর্তনগুলি প্রয়োগ করেছি। আপনি কি মনে করেন যে আপনি কম কোড সহ কলব্যাক দিয়ে এটি বাস্তবায়ন করতে পারবেন? আমি এটাকে সন্দেহ করি.


আপনি কি মনে করেন না যে ফটোমোডেল ক্লাসকে সিঙ্গলটন তৈরি করা নিজেই একটি বাধা? কল্পনা করুন যে এটি কোনও ব্যবহারকারীর প্রোফাইল নয় বরং একাধিক ব্যবহারকারীর জন্য ফটোগুলির সেট, আমরা কেবলমাত্র শেষ অনুরোধকৃত ব্যবহারকারীর ফটো পাব না? প্লাস প্রতিটি ওরিয়েন্টেশন পরিবর্তনের উপর একটি ডেটা অনুরোধ আমার কাছে কিছুটা বন্ধ মনে হচ্ছে, আপনি কী ভাবেন?
ফরিদ

2

আমরা সাধারণত নিম্নলিখিত যুক্তি দিয়ে চলেছি:

  1. যদি এটি একটি সাধারণ এক প্রতিক্রিয়া কল হয়, তবে কলব্যাক বা ভবিষ্যত আরও ভাল।
  2. যদি এটি একাধিক প্রতিক্রিয়া (স্ট্রিম) সহ একটি কল হয় বা যখন বিভিন্ন কলগুলির মধ্যে জটিল ইন্টারঅ্যাকশন হয় (@ নীলের উত্তর দেখুন ), তবে পর্যবেক্ষকগুলি আরও ভাল।

1

অন্যান্য উত্তরের নমুনা এবং সিদ্ধান্তে, আমি মনে করি সহজ এক বা দ্বি-পদক্ষেপের কাজের জন্য কোনও বড় পার্থক্য নেই। তবে কলব্যাক সহজ এবং সোজা। আরএক্সজেভা আরও জটিল এবং সাধারণ কাজের জন্য খুব বড়। তৃতীয় সমাধানটি রয়েছে: অ্যাবাকাসটিল । কলব্যাক, RxJava, CompletableFuture (AbacusUtil) সঙ্গে আমার তিন সমাধান সাথে উপরে ব্যবহারের ক্ষেত্রে বাস্তবায়ন শুরু করা যাক Retrolambda :

নেটওয়ার্ক থেকে ফটো আনুন এবং ডিভাইসে সংরক্ষণ / প্রদর্শন:

// 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
ওপি একটি নতুন লাইব্রেরির জন্য পরামর্শ
চাইছিল না

1

আমি ফিল্টার, মানচিত্র বা ডেটাতে এরকম কিছু করতে বা পূর্ববর্তী কল প্রতিক্রিয়াগুলির ভিত্তিতে আমাকে অন্য এপিআই কল করতে হয় এমন ক্ষেত্রে এপিআই প্রতিক্রিয়া পেতে আমি ব্যক্তিগতভাবে আরএক্স ব্যবহার করতে পছন্দ করি


0

দেখে মনে হচ্ছে আপনি চাকাটি পুনর্নবীকরণ করছেন, আপনি যা করছেন তা ইতিমধ্যে retrofit এ প্রয়োগ করা হয়েছে।

উদাহরণস্বরূপ, আপনি retrofit এর RestAdapterTest.java এ দেখতে পারেন , যেখানে তারা পর্যবেক্ষণযোগ্য একটি ইন্টারফেসকে রিটার্ন টাইপ হিসাবে সংজ্ঞায়িত করে এবং পরে এটি ব্যবহার করতে পারে


উত্তর করার জন্য ধন্যবাদ. আপনি কী বলছেন তা আমি দেখতে পাচ্ছি তবে আমি কীভাবে এটি বাস্তবায়ন করব তা এখনও নিশ্চিত নই। বিদ্যমান retrofit বাস্তবায়ন ব্যবহার করে আপনি কি একটি সাধারণ উদাহরণ প্রদান করতে পারেন যাতে আমি আপনাকে অনুগ্রহ প্রদান করতে পারি?
ইয়াহোসেফ

@ ইয়াহোসেফ তাদের মন্তব্য মুছে ফেলেছে বা আপনি ওপি হওয়ার ভান করছেন? ))
ফরিদ

আপনি অন্য কারও প্রশ্নের উপর একটি অনুদান পুরষ্কার দিতে পারেন। আমি যখন এটি জিজ্ঞাসা করেছি, তখন সত্যই আমার প্রশ্নের উত্তর দরকার ছিল - তাই আমি একটি অনুদানের প্রস্তাব দিয়েছিলাম। আপনি যদি অনুগ্রহ পুরষ্কারে ঘুরে দেখেন তবে দেখতে পাবেন যে এটি আমার দ্বারা পুরষ্কার পেয়েছে।
ইয়েসোসেফ 15'19

0

আপনি যখন মজাদার জন্য কোনও অ্যাপ তৈরি করছেন, কোনও পোষা প্রাণীর প্রকল্প বা কোনও পোকা বা 1 ম প্রোটোটাইপ আপনি সাধারণ কোর অ্যান্ড্রয়েড / জাভা ক্লাস যেমন কলব্যাকস, অ্যাসিঙ্ক টাস্ক, লুপারস, থ্রেড ইত্যাদি ব্যবহার করেন সেগুলি ব্যবহার করা সহজ এবং কোনও প্রয়োজন হয় না do তৃতীয় পক্ষের lib ইন্টিগ্রেশন। কেবলমাত্র একটি ছোট সময়ের অপরিবর্তনীয় প্রকল্প তৈরি করতে একটি বড় গ্রন্থাগার ইন্টিগ্রেশন অযৌক্তিক হয় যখন ব্যাটের ডানদিকে ঠিক একই রকম কিছু করা যায়।

তবে এগুলি খুব ধারালো ছুরির মতো। উত্পাদনের পরিবেশে এগুলি ব্যবহার করা সর্বদা শীতল তবে এর পরিণতিও ঘটতে পারে। আপনি যদি ক্লিন কোডিং এবং সলিড নীতিগুলি সম্পর্কে ভাল জানেন না তবে নিরাপদ সমকালীন কোডটি লেখা শক্ত। ভবিষ্যতের পরিবর্তনগুলি সহজ করার জন্য এবং টিমের উত্পাদনশীলতা উন্নত করতে আপনাকে একটি উপযুক্ত স্থাপত্য বজায় রাখতে হবে।

অন্যদিকে, আরএক্সজেভা, সহ-রুটিন ইত্যাদির মতো সম্মতিযুক্ত লাইব্রেরিগুলিকে প্রযোজনা প্রস্তুত সমবর্তী কোড লিখতে সহায়তা করার জন্য এক বিলিয়নেরও বেশি বার চেষ্টা ও পরীক্ষা করা হয়। এখন আবার, এটি নয় যে এই লাইব্রেরিগুলি ব্যবহার করে আপনি সমবর্তী কোডটি লিখছেন না বা সমস্ত সামঞ্জস্য যুক্তিকে দূরে রেখেছেন। আপনি এখনও আছেন। তবে এখন এটি দৃশ্যমান এবং কোডবেস জুড়ে এবং আরও গুরুত্বপূর্ণভাবে আপনার বিকাশকারী দলের জুড়ে সমবর্তী কোড লেখার জন্য একটি সুস্পষ্ট নিদর্শন প্রয়োগ করে।

কাঁচা সম্মতি নিয়ে কাজ করে এমন সরল পুরাতন মূল শ্রেণীর পরিবর্তে একটি একত্রে ফ্রেমওয়ার্ক ব্যবহারের এটি একটি বড় সুবিধা। তবে আমাকে ভুল বুঝবেন না। আমি বাহ্যিক গ্রন্থাগারের নির্ভরতা সীমাবদ্ধ করার ক্ষেত্রে একটি বড় বিশ্বাসী তবে এই নির্দিষ্ট ক্ষেত্রে আপনাকে আপনার কোড-বেসের জন্য একটি কাস্টম কাঠামো তৈরি করতে হবে যা একটি সময় সাপেক্ষ কাজ এবং এটি অগ্রিম অভিজ্ঞতার পরেই করা যেতে পারে। সুতরাং, কলব্যাক ইত্যাদির মতো সাধারণ ক্লাস ব্যবহারের চেয়ে সম্মতিযুক্ত ফ্রেমওয়ার্কগুলি অগ্রাধিকার দেওয়া হয় etc.


TL'DR

আপনি যদি ইতিমধ্যে কোড বেস জুড়ে একযোগে কোডিংয়ের জন্য RxJava ব্যবহার করে থাকেন তবে কেবল RxJava পর্যবেক্ষণযোগ্য / প্রবাহযোগ্য ব্যবহার করুন। তারপরে একটি বুদ্ধিমান প্রশ্ন জিজ্ঞাসা করা হ'ল আমি কি পর্যবেক্ষণযোগ্যদের কাছে পর্যবেক্ষণগুলি ব্যবহার করব। যদি তা না হয় তবে এগিয়ে যান এবং কলযোগ্য ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.