【问题标题】:RxAndroid: Retrofit doesn't work on the second time?RxAndroid:第二次改造不行?
【发布时间】:2016-11-13 15:31:45
【问题描述】:

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

          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: Skipped 115 frames!应用程序可能在其主线程上做的工作太多。” p>

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

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?

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

为什么,你知道吗?

谢谢

【问题讨论】:

    标签: retrofit rx-java rx-android


    【解决方案1】:

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

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

    【讨论】:

    • 但是,在第一部分代码中:“apiService.checkAccount(mUser.getEmail()).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread()).subscribe(mSubscirber) ;”,我在“onComplete”之后执行“mSubscirber.unsubscirbe()”,第二次点击还是不行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2017-03-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多