onNext() onError() callbacks not executing on second subscribtion android

旧巷老猫 提交于 2020-01-05 03:55:07

问题


I've an Observable something like this:

@GET("endpoint")
Observable<Something> getSomething();

and Subscriber like this

Subscriber<Something> somethingSubscriber = new Subscriber<Something>() {
        public void onCompleted() {
    }

        public void onError(Throwable e) {
        //handle exceptions
    }

        public void onNext() {
        //do something
    }

In my OnClickListener associated with a button, i make a subscription

getSomething()
     .subscribeOn(Schedulers.newThread())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(somethingSubscriber);

If i don't have an internet connection, onError is called and i do some exception handling. when I press the button again (assume i want to retry), the callback methods do not get called.

I want that onNext / onError callbacks get called everytime I press the button.


回答1:


There is extention for RxJava. It has a lot of "cool tools", but for handling retrofit errors you can use ResponseOrError class.

So in you case it would looks like:

final PublishSubject<Object> clickSubject = PublishSubject.create();

final Observable<ResponseOrError<Something>> responseOrErrorObservable = clickSubject
            .flatMap(new Func1<Object, Observable<ResponseOrError<Something>>>() {
                @Override
                public Observable<ResponseOrError<Something>> call(Object o) {
                    return getSomething()
                            .subscribeOn(Schedulers.newThread())
                            .observeOn(AndroidSchedulers.mainThread())
                            .compose(ResponseOrError.<Something>toResponseOrErrorObservable());
                }

            })
            .replay(1)
            .refCount();
final Observable<Throwable> error = responseOrErrorObservable
     .compose(ResponseOrError.<Something>onlyError())
     .subscribe(new Action1<Segment>() {
                @Override
                public void call(Throwable throwable) {
                       // what to do on error, some toast or what ever yu need
                }
            });
final Observable<UserInfoResponse> success = responseOrErrorObservable
     .compose(ResponseOrError.<Something>onlySuccess())
     .subscribe(new Action1<Something>() {
                @Override
                public void call(Something some) {
                    // code what to do on success
                }
            });

And now, into onClick you just need to put clickSubject.onNext(null)

.replay(1).refCount(); needed because there are 2 Observables that uses responseOrErrorObservable, so without it retrofit request will "happens" two times.




回答2:


You are reusing the same Subscriber. Once you get the onError or a result (so it completes) the subscriber is unsubscribed. Try to pass every time a new subscriber.




回答3:


use this code

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getSomething()
               .subscribeOn(Schedulers.newThread())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Action1<Something>() {
                           @Override
                           public void call(Something something) {
                               //do something
                           }
                       },
                    new Action1<Throwable>() {
                        @Override
                        public void call(Throwable throwable) {
//handle exceptions
                        }
                    },
                    new Action0() {
                        @Override
                        public void call() {

                        }
                    });

        }
    });

Addition

or

replace this

Subscriber<Something> somethingSubscriber = new Subscriber<Something>() {
        public void onCompleted() {
    }

        public void onError(Throwable e) {
        //handle exceptions
    }

        public void onNext() {
        //do something
    }

};

to

Subscriber<String> somethingSubscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {

            }
        };



回答4:


In my Case onNext() and onError() methods are not getting called because of my model class wrong parsing, I was taking a double object as Integer so NumberFormatException was thrown and nothing was happening after getting the result from retrofit.



来源:https://stackoverflow.com/questions/40305865/onnext-onerror-callbacks-not-executing-on-second-subscribtion-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!