如果Internet不可用,为什么Retrofit会等到超时再给onFailure打电话?

时间:2019-03-06 16:24:43

标签: android retrofit2 okhttp okhttp3

我正在使用Retrofit2在我的Android应用程序中进行API调用。我正在通过以下方式创建Retrofit客户端。

if (retrofitClient == null) {
    val retrofitBuilder = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())

    val okHttpClientBuilder = OkHttpClient.Builder()
                .readTimeout(API_REQUEST_TIMEOUT.toLong(), TimeUnit.SECONDS)
                .connectTimeout(API_REQUEST_TIMEOUT.toLong(), TimeUnit.SECONDS)

    retrofitClient = retrofitBuilder.client(okHttpClientBuilder.build()).build()
}

val call = retrofitClient?.create(ApiService::class.java)?.getMovies()
call?.enqueue(object : Callback<MoviesResponse> {
    override fun onResponse(call: Call<MoviesResponse>, response: Response<MoviesResponse>) {
        //Handle Success
    }
    override fun onFailure(call: Call<MoviesResponse>, t: Throwable) {
        //Handle failure
    }
})

在这里,如果在进行第一个调用时互联网连接不可用(当刚创建RetrofitClient时),我会立即收到onFailure回调。但是,如果第一个调用存在互联网连接,而第二个API调用不存在互联网连接(我将第二个API调用重新使用RetrofitClient),则超时后将使用java.net.SocketTimeoutException调用onFailure。

关于onFailure回调为何延迟到超时的任何评论吗?

我在以21级或更高级别的API运行的Android模拟器中遇到此问题。在这里,通过启用模拟器数据使wifi保持关闭状态来打开Internet连接。

我已经在少数设备中进行了测试,例如三星S8,三星Note 8,Mi A1,小米Redmi Note 3和Sony Ericsson手机(在4.1.2中运行),该问题在所有这些设备中均无法再现。我相信可能很少有设备可以重现此问题,因为在模拟器中总是可以重现此问题。

如果我不重复使用RetrofitClient,则问题不存在。所以我也想知道重用RetrofitClient是否很好。

预先感谢:)

0 个答案:

没有答案