2016-11-17 23 views
8

私はアプリケーションの1つにokhttpとretrofitを使用していますが、RxJavaを使用してさまざまなスレッドで多くのリクエストを処理しています。 時々、私はリクエストのいずれかでSocketExceptionを取得しましたが、リクエストはサーバーに到達できません。HTTPの原因は何ですか?失敗しました:java.net.SocketException:Socket closed?

私は1つのサンプルを共有することができます。

共有できるコードから変更されたスニペットはほとんどありません。

Subscription details = api.details("keyword") 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<Model>() { 
        @Override 
        public void onCompleted() { 
         Timber.d("onCompleted(): "); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Timber.e(e, "onError(): "); 
        } 

        @Override 
        public void onNext(final Model details) { 
         Timber.d("onNext(): "); 
        } 
       }); 

3つのコールバックのすべてから何も呼び出されません。

Stackstace:

11-17 15:50:53.991 16595-10314/ D/OkHttp: --> GET API_REQUEST_URL 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Host: HOST_NAME 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Connection: Keep-Alive 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Accept-Encoding: gzip 
11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: okhttp/3.4.2 
11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: Android-App 
11-17 15:50:53.991 16595-10314/ D/OkHttp: --> END GET 
11-17 15:50:53.992 16595-10314/ D/OkHttp: <-- HTTP FAILED: java.net.SocketException: Socket closed 

その他のIOException

11-17 16:36:04.274 28523-29137/ D/OkHttp: Host: HOST_NAME 
11-17 16:36:04.274 28523-29137/ D/OkHttp: Connection: Keep-Alive 
11-17 16:36:04.274 28523-29137/ D/OkHttp: Accept-Encoding: gzip 
11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: okhttp/3.4.2 
11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: Android-App 
11-17 16:36:04.274 28523-29137/ D/OkHttp: --> END GET 
11-17 16:36:04.282 28523-29137/ D/OkHttp: <-- HTTP FAILED: java.io.IOException: unexpected end of stream on [email protected] 

スクリプション私は細かい作業を頻繁に呼び出すしようとしているが、時々エラーの上にあり、その後、動作を停止しています。 アフェファーワードはサーバーに到達できません。ちょうどチェック設定のためのいくつかのヘルパーメソッドの下

改造インタフェースからのメソッド

@GET("/v1/app_endpoint/{keyword}/") 
Observable<Model> details(@Path("keyword") String keyword); 

何が必要な場合。

public static Retrofit retrofit() { 
    return provideRetrofit(provideGson(), provideOkHttpClient()); 
} 

public static Gson provideGson() { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.addSerializationExclusionStrategy(new AnnotationExclusionStrategy()); 
    gsonBuilder.addDeserializationExclusionStrategy(new AnnotationExclusionStrategy()); 
    gsonBuilder.setExclusionStrategies(new ExclusionStrategy() { 
     @Override 
     public boolean shouldSkipField(FieldAttributes f) { 
      return f.getDeclaringClass().equals(RealmObject.class); 
     } 

     @Override 
     public boolean shouldSkipClass(Class<?> clazz) { 
      return false; 
     } 
    }); 
    gsonBuilder.registerTypeAdapterFactory(AutoValueGsonTypeAdapterFactory.create()); 
    return gsonBuilder.create(); 
} 

public static OkHttpClient provideOkHttpClient() { 
    return new OkHttpClient.Builder() 
      .connectTimeout(30, TimeUnit.SECONDS) 
      .writeTimeout(600, TimeUnit.SECONDS) 
      .readTimeout(1, TimeUnit.MINUTES) 
      .retryOnConnectionFailure(true) 
      .addNetworkInterceptor(new Interceptor() { 
       @Override 
       public okhttp3.Response intercept(Chain chain) throws IOException { 
        Request newRequest = chain.request().newBuilder() 
          .addHeader("Content-Type", "application/json") 
          .addHeader("User-Agent", "Android-App") 
          .build(); 
        return chain.proceed(newRequest); 
       } 
      }) 
      .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) 
      .build(); 
} 

public static Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
    return new Retrofit.Builder() 
      .baseUrl(BuildConfig.API_URL) 
      .client(okHttpClient) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
      .build(); 
} 

依存

私の場合は
// Networking 
compile 'com.squareup.okhttp3:okhttp:3.4.2' 
compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
+0

この問題の解決方法はありますか?私はokhttp 3.5.0/RxJava 2/Jacksonを使用して、複数の非同期HTTPリクエストを使用して同様のランダムエラーが発生しています。 –

+0

私はあなたのサーバーの接続/読み取り/書き込み時間に基づいてタイムアウトの設定で再生する必要があると言うことができます。 –

+0

接続を設定してタイムアウトを読み書きする際に同じ問題が発生するので、SocketExceptionがライブラリによって処理されていると思いますが、奇妙なことがエラー、完了、または次のメソッドに到達しない私の場合、Observableは決して終わらない...どんな助けもありがたい。 –

答えて

1

、私は私がHTTP FAILED: java.net.SocketException: Socket closedエラーの原因とonCompleted()onError()またはonNext()コールバックのいずれかを呼び出していなかった突然の予期せぬunsubscribe()呼び出したなっていた発見 - チェックディスカッションを外してhereと答えてください。だから、

、ちょうど追加、そのケースを扱うことができるようにする:あなたのObservable

.doOnUnsubscribe(() -> { /*handle logic here*/ }) 

を、多分うまくいけば、通常の活動を再開させる能力につながるれ、そこにいくつかの状態をリセットしてみてください。

0

私の場合、間違ったURLを要求しました。ERR_CONNECTION_REFUSEDです。

関連する問題