RxJavaとRetrofit(2.3)を使用してリクエストを作成しようとしています。エラーが発生した場合には、クライアントにメッセージを再試行したり表示したりすることができます。SocketException onErrorのないサブスクライブ解除要求
しかし、私は時々、onErrorを呼び出さないSocketExceptionがあることに気づきました。要求のサブスクライバは、他のものを呼び出さずに単にサブスクライブしないだけです(onErrorもonErrorもありません)。なぜこれが起こっているのか誰にでもわかっています。単純にonUnsubscribe()を実行してオブザーバブルがonErrorまたはonCompleteを送信しなかったかどうかを確認することなく、これを一般的な方法で解決するにはどうすればよいですか? ------
public Observable<UserModel> requestUserInfo(final String token) {
return mService.getUserInfo(token)
.retryWhen(new RetryWithDelay(HTTP_RETRIES), HTTP_TIME_BETWEEN_RETRIES)))
.flatMap(new Func1<List<UserInfo>, Observable<UserModel>() {
@Override
public Observable<UserModel> call(List<UserInfo> userInfo) {
return Observable.just(new UserModel(userInfo));
}
});
}
------ UPDATE:
@GET("userInfo")
Observable<List<UserInfo>> getUserInfo(@Header("token") String token);
これは私が私の観察可能なを作成する方法である:私のインターフェイスで
私はこのような何かを持っています -
これは私の発表者のrequestUserInfoメソッドを呼び出す方法です。
private CompositeSubscription mCompositeSubscription = null;
public PresenterX(ViewX view) {
...
mCompositeSubscription = new CompositeSubscription();
}
public void getUserModel() {
String userToken = new AccessModel().getUserToken();
mCompositeSubscription.add(mNetworkRequestModel.requestUserInfo(userToken)
.flatMap(new Func1<UserModel, Observable<UserModel>>() {
@Override
public Observable<UserModel> call(UserModel userModel) {
if (userModel != null) {
saveUserModel(userModel); //sync saving
return Observable.just(userModel);
} else {
return Observable.error(new SaveException());
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<UserModel>() {
@Override
public void onCompleted() {
Log.i(TAG, "Subscriber was completed")
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "Subscriber called onError")
mView.handleErrors(e);
}
@Override
public void onNext(UserModel userModel) {
Log.i(TAG, "Subscriber called onNext")
mView.populateUserInfo(userModel);
}
}));
}
//called by activity when onDestroyMethod is called
//I assume this is not called as I have other requests running parallelly to this getUserModel() and they are not terminated, despite having other compositeSubscription to manage those
public void onDestroy(){
mCompositeSubscription.clear();
}
私はHttpLoggingInterceptorを持っているので、要求が突然停止している間に、これが私に印刷される唯一のログです。あなたは、サーバーからのRxオブジェクト(観測)を取得しようとするので
I/ExampleApp-ApiClient(21338): : Thread: 1343 | <-- HTTP FAILED: java.net.SocketException: Socket closed
を削除 'Observable.subscribe'が呼び出されるコードを含めてください。アンサブスクライブやonErrorの問題は、それらのエンドポイントで発生します。 – Kiskae