onNext()onError()回调没有在第二个订阅android上执行

问题描述 投票:1回答:4

我有一个像这样的Observable:

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

和订阅者一样

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

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

        public void onNext() {
        //do something
    }

在与按钮关联的OnClickListener中,我进行订阅

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

如果我没有互联网连接,则会调用onError并执行一些异常处理。当我再次按下按钮(假设我想重试)时,不会调用回调方法。

我希望每次按下按钮都会调用onNext / onError回调。

android retrofit rx-java retrofit2
4个回答
2
投票

RxJava有extention。它有很多“很酷的工具”,但是为了处理改造错误,你可以使用ResponseOrError类。

所以在你的情况下,它看起来像:

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

而现在,进入onClick你只需要把clickSubject.onNext(null)

.replay(1).refCount();需要因为有2个Observable使用responseOrErrorObservable,所以如果没有它,改装请求将“发生”两次。


1
投票

您正在重用相同的订阅者。一旦你得到onError或结果(所以它完成),订阅者就会被取消订阅。每次尝试新用户时都要通过。


1
投票

使用此代码

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() {

                        }
                    });

        }
    });

加成

要么

替换这个

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

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

        public void onNext() {
        //do something
    }

};

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

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {

            }
        };

0
投票

在我的Case onNext()和onError()方法没有被调用,因为我的模型类错误解析,我正在将一个双重对象作为Integer,因此抛出了NumberFormatException,并且在从改造中获得结果后没有发生任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.