Dur*_*tel 7 android interceptor kotlin okhttp retrofit2
我正在研究 android 原生 kotlin 项目。
我正在使用Android 版本 10 的android real Oneplus 6设备测试应用程序。
请从 build.gradle 文件中找到以下详细信息,了解我用于项目的最新 okhttp 和改造依赖项。
好http
implementation "com.squareup.okhttp3:okhttp:4.9.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.9.0"`
Run Code Online (Sandbox Code Playgroud)
改造
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Run Code Online (Sandbox Code Playgroud)
我已经为 okhttpclient 设置了相关超时。
.connectTimeout(HTTP_CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(HTTP_READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(HTTP_WRITE_TIMEOUT, TimeUnit.SECONDS)
Run Code Online (Sandbox Code Playgroud)
我正在使用okhttp3.Interceptor。请在下面找到实现。
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
class AuthorizationInterceptor(private val sharedPreferenceService: SharedPreferenceService) :
Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val requestBuilder = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
return chain.proceed(requestBuilder.build())
}
}
Run Code Online (Sandbox Code Playgroud)
观察/问题
return chain.proceed(requestBuilder.build())我从我的 android studio 中找出了okhttp 内部崩溃日志,可以帮助您找到根本原因和修复方法。
FATAL EXCEPTION: main
Process: com.pg.posm, PID: 8770
javax.net.ssl.SSLException: Read error: ssl=0x7afca87588: I/O error during system call, Software caused connection abort
Run Code Online (Sandbox Code Playgroud)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pg.posm, PID: 26238
java.net.ConnectException: Failed to connect to hostname/ip:port
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 try-catch 将拦截器片段包装在上面,但仍然 okhttp3 本身崩溃,因此 App 崩溃了。
我们没有任何控制来解决它。
请在下面找到带有包装的 try-catch 实现的拦截器片段。
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import timber.log.Timber
import java.io.IOException
class AuthorizationInterceptor(private val sharedPreferenceService: SharedPreferenceService) :
Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val requestBuilder = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
try {
return chain.proceed(requestBuilder.build())
}catch (e: Throwable) {
if (e is IOException) {
throw e
} else {
throw IOException(e)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以尝试使用相关设置和片段制作小型 android 项目并查看。
请为这个阻止程序问题提供必要的修复或方法,因为世界上很多人都面临着这个问题。
如果您需要更多详细信息,请告诉我。我很乐意为您提供。
我正在努力解决这个问题。这个错误并不奇怪。
正如你所说
如果 API 调用正在进行中,并且我们尝试更改或禁用网络/互联网,那么一旦从上面的代码段执行下面的行,okhttp3 本身就会内部崩溃,因此应用程序崩溃。
为什么这对你来说如此奇怪?
如日志所示
FATAL EXCEPTION: main
Process: com.pg.posm, PID: 8770
javax.net.ssl.SSLException: Read error: ssl=0x7afca87588: I/O error during system call,
Software caused connection abort
Run Code Online (Sandbox Code Playgroud)
你有一个 SSL/TLS 连接,这意味着,在建立到服务器的连接并传输数据之前,有很多事情会透明地发生,例如:
上述操作以及安全通道仅对当前连接的安全套接字有效,对任何其他安全套接字无效。
再次支持你的说法
如果 API 调用正在进行中并且我们尝试更改或禁用网络/互联网
上述操作使之前连接的安全套接字无效,并抛出 SslException(MitM 保护)。
我希望上述陈述对您有所帮助。
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |