2017-06-02 82 views
1

我试图使用RxJava和Retrofit(2.3)进行请求。我期待如果有任何错误,我可以重试或向客户端显示消息。然而,我注意到有时我有一个SocketException,导致不会调用onError,显然该请求的订阅者只是退订而没有调用任何其他(而不是onComplete onError)。任何人都知道为什么会发生这种情况,我怎样才能以通用的方式解决这个问题(没有简单地做onUnsubscribe()并检查observable是否没有发送onError或onComplete)?SocketException在没有onError的情况下取消订阅请求

在我的界面我有这样的事情:

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

这是我创造我观察到:

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

这就是我如何在我的演示者上调用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,这是在请求突然停止时打印给我的唯一日志。

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

这里是日志例外:

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

请包含代码,其中调用Observable.subscribe。取消订阅或“onError”问题发生在这些端点。 – Kiskae

回答

-1

因为你试图从服务器接收对象(可观察)。您的功能不正确 删除可观察

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

这个解决方案为什么会起作用?我的意思是我在每个请求和所有工作都可以观察到,除非我有一个套接字异常,可观察的取消订阅没有任何事件 – iGoDa

相关问题