简体   繁体   中英

RxAndroid chain actions

I am using RxAndroid + Retrofit and what I want to do is to combine 2 actions in one. For example I have two methods. First one return some URL in onNext block.

apiRequests.getApi().getURL()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<CreateUserResponse>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(CreateUserResponse createUserResponse) {
                    secondMethos(createUserResponse.getURL()); // HERE GOES THE URL

                }
            });

The second method user this URL to do something else

public void secondMethod(URL){
    Observable.create(new Observable.OnSubscribe<Object>() {


        @Override
        public void call(Subscriber<? super Object> subscriber) {

        }
    });

    Observable.create(new Observable.OnSubscribe<List<Arg>>() {
        @Override
        public void call(Subscriber<? super List<Arg>> subscriber) {
            subscriber.onNext(test(URL));
            subscriber.onCompleted();

        }
    }).subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Arg>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(List<Arg> params) {

                }
            });


}

Is it possible to combine these methods into one? Thanks

You can simply map the values as such

    apiRequests.getApi().getURL()
            .map(new Func1<CreateUserResponse, List<Arg>>() {
                public List<Arg> call(CreateUserResponse response) {
                    return test(response.getURL());
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observerOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Arg>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(List<Arg> params) {

                }

Note if you want onNext called with each Arg instead of List<Arg> you can use flatMapInterable as below.

    apiRequests.getApi().getURL()
            .flatMapIterable(new Func1<CreateUserResponse, List<Arg>>() {
                public List<Arg> call(CreateUserResponse response) {
                    return test(response.getURL());
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observerOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Arg>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Arg params) {

                }
            });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM