【问题标题】:HTTP FAILED: java.net.SocketException: Socket closed RetrofitHTTP 失败:java.net.SocketException:套接字关闭改造
【发布时间】:2018-06-07 10:47:01
【问题描述】:

尝试了多种方法仍然面临这个问题

我正在使用 RxJava 和 Retrofit 来完成我所有的网络操作。下面是我的代码。

Service.kt

@GET("/v1/contact/{id}")
fun getContactDetails(@Path("id") id:String): Flowable<ContactDetailResponse>

AccountRepositoryImpl.kt

 override fun contactDetails(contactId:String) {
    mContactResponse.loading(true)
    remote.getContactDetails(contactId)
            .performOnBackOutOnMain(scheduler)
            .subscribe({
                data -> mContactResponse.success(data)
            },{
                error -> mContactResponse.failed(error)
            })
            .addTo(compositeDisposable)
}

Extensions.kt

fun <T> Flowable<T>.performOnBackOutOnMain(scheduler: Scheduler): 
Flowable<T> {
  return this.subscribeOn(scheduler.io())
        .observeOn(scheduler.mainThread())
}

NetworkModule.kt

@Module
class NetworkModule(val key: String, val secret: String) {

 @Provides
 @Singleton
 fun providesRetrofit(jacksonConverterFactory: JacksonConverterFactory,
                     rxJava2CallAdapterFactory: 
 RxJava2CallAdapterFactory,
                     okHttpClient: OkHttpClient,
                     baseUrl: String): Retrofit {

    return Retrofit.Builder().baseUrl(baseUrl)
            .addConverterFactory(jacksonConverterFactory)
            .addCallAdapterFactory(rxJava2CallAdapterFactory)
            .client(okHttpClient)
            .build()
 }

  @Provides
  @Singleton
  fun providesOkHttpClient(cache: Cache, httpInterceptor: 
  HttpLoggingInterceptor): OkHttpClient {

    val client = OkHttpClient.Builder()
            .cache(cache)
            .addInterceptor(httpInterceptor)
            .retryOnConnectionFailure(true)
            .connectTimeout(100, TimeUnit.SECONDS)
            .writeTimeout(100, TimeUnit.SECONDS)
            .readTimeout(100, TimeUnit.SECONDS)


    return client.build()
  }

}

【问题讨论】:

  • 在 Manifest 中设置了 INTERNET 权限?
  • @Christopher 已获得许可
  • 好的,我想我们需要更详细的错误描述。 SocketException 有几个原因。相同的 HTTP 请求是否适用于不同的工具,例如邮差?确保原因不是您的后端。
  • 是的,得到邮递员的回复,但我对此表示不满。
  • 你有没有机会处置compositeDisposable

标签: android retrofit2 rx-java2


【解决方案1】:

您可以像下面这样创建您的 OkHttp 客户端,我在低网络中遇到了套接字关闭异常,在添加了以下类似 OkhttpClient 问题解决后

connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
协议(listOf(Protocol.HTTP_1_1))

        OkHttpClient.Builder().apply {
        .connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
        .protocols(listOf(Protocol.HTTP_1_1))
        connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
        writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
        readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
        retryOnConnectionFailure(false)
        }.build()

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2021-09-15
    相关资源
    最近更新 更多