我正在使用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?
看起来“订阅者”不能是一个实例?
为什么,有任何想法吗?
由于
答案 0 :(得分:-1)
一旦observable发出终端事件(完整或错误事件),它就不会再发出任何事件(参见here)。每次调用apiService.checkAccount(mUser.getEmail())
都会创建一个新的observable,您可以向订阅者订阅。这会创建一个订阅。
您可能希望在完成后存储订阅对象和unsubscribe
。