首页 > 解决方案 > 启动器应用程序上的 Okhttp SocketTimeoutException

问题描述

我有一个应用程序是Android的默认启动器。

当我重新启动手机时,应用程序运行,然后尝试进行 http 调用并收到此异常:

HTTP FAILED: java.net.SocketTimeoutException: failed to connect to XXXX (port 80) from localAddress.getAddress() (port 42208) after 30000ms

如果我离开应用程序并返回它,http 调用就会开始工作。

这是我的客户端设置:

val client = OkHttpClient.Builder()
            client.connectTimeout(30, TimeUnit.SECONDS)
            client.readTimeout(30, TimeUnit.SECONDS)
            client.writeTimeout(30, TimeUnit.SECONDS )
            client.retryOnConnectionFailure(true)
            client.connectionPool(ConnectionPool(0, 5, TimeUnit.MINUTES))
            client.protocols(listOf(Protocol.HTTP_1_1))

val retrofit = Retrofit.Builder()
                    .client(client.build())
                    .addCallAdapterFactory(
                            RxJava2CallAdapterFactory.create())
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(
                            GsonConverterFactory.create())
                    .baseUrl(base_url)
                    .build()

设备:小米红米8a

操作系统:MIUI 10.3.3.0 Android 9

改造:2.7.2

OKHttp:4.4.0

标签: androidretrofitretrofit2okhttpandroid-launcher

解决方案


我遇到了类似的问题。不确定这是您的答案,但我希望它能解决您的问题。

如果我错了,您正在尝试使用 RxJava2 获取数据。根据this document- error handling documentationdisposed文档告诉 throwable 错误在 observable /之后无法处理terminated

这意味着当你的Single/Observable被调用时onComplete(),有时它会携带一个错误并抛出UndeliverableExceptionSocketTimeoutException或其他Exceptions。我们SocketTimeoutException在 Firebase Crashlytics 中遇到了很多问题。

我们已经处理了在我们的AppApplication类中添加这一行 [ onCreate()] -

RxJavaPlugins.setErrorHandler { error: Throwable ->
        Timber.e(error) // you can do some task with the Throwable here if you need
    }

我希望,它会有所帮助...... :)


推荐阅读