SocketException unsubscribing request without onError

孤人 提交于 2021-01-28 03:11:51

问题


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:


Because you try to get rx object (Observable) from server. You have incorrect function Remove Observable

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


来源:https://stackoverflow.com/questions/44324941/socketexception-unsubscribing-request-without-onerror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!