2017-06-02 6 views
1

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

を削除 'Observable.subscribe'が呼び出されるコードを含めてください。アンサブスクライブやonErrorの問題は、それらのエンドポイントで発生します。 – Kiskae

答えて

-1

:ここ

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

は、ログ例外です。あなたは間違った機能を持っている が観測

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

このソリューションはなぜ機能するのですか?私は、すべてのリクエストで観測可能であり、イベントがなくても観測可能なunsubscribesを持つソケット例外がある場合を除いて、正しく動作することを意味します – iGoDa

関連する問題