onNext() onError() 回调未在第二次订阅 android 上执行 [英] onNext() onError() callbacks not executing on second subscribtion android

查看:28
本文介绍了onNext() onError() 回调未在第二次订阅 android 上执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的 Observable:

I've an Observable something like this:

@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 中,我进行了订阅

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

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

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

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.

我希望每次按下按钮时都调用 onNext/onError 回调.

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

推荐答案

extension 用于 RxJava.它有很多很酷的工具",但是为了处理改造错误,您可以使用 ResponseOrError 类.

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

现在,在 onClick 中你只需要输入 clickSubject.onNext(null)

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

.replay(1).refCount(); 需要,因为有 2 个 Observables 使用 responseOrErrorObservable,所以没有它改造请求将发生"两次.

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

这篇关于onNext() onError() 回调未在第二次订阅 android 上执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆