2016-11-17 93 views
8

我使用okhttp和retrofit爲我的應用程序之一,我有很多請求使用RxJava在不同的線程上工作。 有時,我在任何請求和後綴都沒有請求可以在服務器上達到SocketException。什麼導致HTTP失敗:java.net.SocketException:套接字關閉?

例如,我可以分享一個樣本。

很少修改代碼片段可以共享。

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] 

訂閱我想打電話給經常工作正常,但有時上面的錯誤是存在的,然後停止工作。 Aferwords沒有請求可以到達服務器。從更新接口

@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

你有沒有得到這個問題的決議?我看到使用多個異步http請求使用okhttp 3.5.0/RxJava 2/Jackson類似的隨機錯誤。 –

+0

我可以說你只需要根據你的服務器連接/讀/寫時間來使用超時配置。 –

+0

當我設置連接,讀寫超時時,我有同樣的問題,所以,我猜SocketException正在被庫處理,但奇怪的是它從來沒有達到任何錯誤,完成或接下來的方法和在我的情況下,Observable永遠不會結束......任何幫助,將不勝感激。 –

回答

1

就我而言,我發現我越來越是一個突如其來的意外unsubscribe()呼叫所導致HTTP FAILED: java.net.SocketException: Socket closed錯誤和不調用任何onCompleted()onError()onNext()回調 - 檢查進行討論並回答here

所以,爲了能夠處理這種情況下,只需添加:

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

Observable,也許嘗試重置有一些狀態,這有望將導致恢復正常活動的能力。

0

在我的情況下,我要求一個錯誤的URL獲得錯誤ERR_CONNECTION_REFUSED

相關問題