我正在使用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是否很好。
预先感谢:)