RxAndroid:Retrofit第二次不起作用?

时间:2016-07-11 15:46:15

标签: retrofit rx-java rx-android

我正在使用RxAndroid和Retrofit进行httpRequest,我的代码如下:

          OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging)
                    .authenticator(new DigestAuthenticator())
                    .build();
            // retrofit with custom client
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(NetUtil.getServerBaseUrl())
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(client)
                    .build();
            ApiService apiService = retrofit.create(ApiEndpoints.class);


    CustomerSubscriber mSubscriber = new CustomerSubscriber(); 

apiService.checkAccount(mUser.getEmail()).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread()).subscribe(mSubscirber);


    //Retrofit   
     @Headers({
                "Accept: application/json;charset=utf-8",
                "Content-Type: application/json;charset=utf-8"
        })
        @HEAD("/account")
        Observable<Result<Void>> rxHeadAccount(
                @Query("email") String encryptedEmail);

我的场景是这样的:每当我点击“apiService.checkAccount()”按钮时,都会触发该方法。第一次:点击按钮,发送httpRequest,我可以得到回复

但是,第二次点击,没有发送httpRequest,日志显示“ I / Choreographer:跳过115帧!应用程序可能在其主线程上做了太多工作。

但是,如果我将代码更改为

apiService.checkAccount(mUser.getEmail()).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread()).subscribe(new Subscriber<Result<Void>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Result<Void> voidResult) {

                    }
                });
            }
        });

Retrofit效果很好,可以根据需要多次发送HttpRequest?

看起来“订阅者”不能是一个实例?

为什么,有任何想法吗?

由于

1 个答案:

答案 0 :(得分:-1)

一旦observable发出终端事件(完整或错误事件),它就不会再发出任何事件(参见here)。每次调用apiService.checkAccount(mUser.getEmail())都会创建一个新的observable,您可以向订阅者订阅。这会创建一个订阅。

您可能希望在完成后存储订阅对象和unsubscribe