SocketException unsubscribing request without onError

Viewed 175

I'm trying to make a request using RxJava and Retrofit(2.3). I'm expecting that in case of any error I can retry or show a message to the client.

However, I notice that sometimes I have a SocketException which results in not calling onError, apparently the subscriber of the request just unsubscribes without calling anything else (not onComplete neither onError). Anyone knows why this is happening and how can I solve this in a generic way (without simply doing onUnsubscribe() and checking if the observable did not send any onError or onComplete)?

On my interface I have something like this:

@GET("userInfo")
Observable<List<UserInfo>> getUserInfo(@Header("token") String token);

This is how I create my observable:

    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 -------

This is how I call the requestUserInfo method on my presenter

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

As I have a HttpLoggingInterceptor, this is the only log printed to me while the request suddenly stops.

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {
                LOG.info(Thread.currentThread(), String.format("%s", message));
        }
    });

Here is the log exception:

I/ExampleApp-ApiClient(21338): : Thread: 1343 |  <-- HTTP FAILED: java.net.SocketException: Socket closed
1 Answers
Related