带有改造 api 请求的 ExceptionInInitializerError
ExceptionInInitializerError with retrofit api request
我在改造 api 请求时遇到了小问题,问题出现在我为请求设置配置的界面中,我只在 android 4.4,在更高版本上我没有收到这个错误,请提供一些帮助谢谢
- 这是Api界面
@GET("everything")
suspend fun getNews(@Query("q") query: String, @Query("apiKey") apiKey : String
,@Query("page")page : Int) : AllNewsModel
@GET("top-headlines")
suspend fun getHeadlines(@Query("country")country : String, @Query("apikey")apiKey: String,
@Query("page") page : Int) : HeadlinesModel
companion object {
var response : ApiResponse? = null
fun News() : ApiResponse {
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build().create(ApiResponse::class.java)
return response!!
}
fun Headlines() : ApiResponse {
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build().create(ApiResponse::class.java)
return response!!
}
}
}
- 一错二错第一个是:
java.lang.ExceptionInInitializerError
- 第二个错误是:
Caused by: java.lang.IllegalStateException: Expected Android API level 21+
but was 19 at okhttp3.internal.platform.AndroidPlatform.<clinit>
**编辑:在检查了有关此问题的一些主题后,我发现一个常见的答案是添加旧版本的 OkHttp 库,我这样做了,但它最终显示了另一个错误,这里是:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x75038d5c:0x00000000)
FATAL EXCEPTION: DefaultDispatcher-worker-2
Process: com.example.testingproject, PID: 10143
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x78ab22a8: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x75038d5c:0x00000000)
- 这是我添加的旧库
implementation("com.squareup.okhttp3:okhttp:3.12.0"){
force = true
}
经过深入搜索,我发现这个解决方案对我有用 android 4.4 ( api 19 )
val spec = ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
.tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0)
.cipherSuites(
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
.build()
val okttp = OkHttpClient.Builder()
.connectionSpecs(Collections.singletonList(spec))
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okttp.build())
.build().create(ApiResponse::class.java)
我在改造 api 请求时遇到了小问题,问题出现在我为请求设置配置的界面中,我只在 android 4.4,在更高版本上我没有收到这个错误,请提供一些帮助谢谢
- 这是Api界面
@GET("everything")
suspend fun getNews(@Query("q") query: String, @Query("apiKey") apiKey : String
,@Query("page")page : Int) : AllNewsModel
@GET("top-headlines")
suspend fun getHeadlines(@Query("country")country : String, @Query("apikey")apiKey: String,
@Query("page") page : Int) : HeadlinesModel
companion object {
var response : ApiResponse? = null
fun News() : ApiResponse {
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build().create(ApiResponse::class.java)
return response!!
}
fun Headlines() : ApiResponse {
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build().create(ApiResponse::class.java)
return response!!
}
}
}
- 一错二错第一个是:
java.lang.ExceptionInInitializerError
- 第二个错误是:
Caused by: java.lang.IllegalStateException: Expected Android API level 21+
but was 19 at okhttp3.internal.platform.AndroidPlatform.<clinit>
**编辑:在检查了有关此问题的一些主题后,我发现一个常见的答案是添加旧版本的 OkHttp 库,我这样做了,但它最终显示了另一个错误,这里是:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x75038d5c:0x00000000)
FATAL EXCEPTION: DefaultDispatcher-worker-2
Process: com.example.testingproject, PID: 10143
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x78ab22a8: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x75038d5c:0x00000000)
- 这是我添加的旧库
implementation("com.squareup.okhttp3:okhttp:3.12.0"){
force = true
}
经过深入搜索,我发现这个解决方案对我有用 android 4.4 ( api 19 )
val spec = ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
.tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0)
.cipherSuites(
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
.build()
val okttp = OkHttpClient.Builder()
.connectionSpecs(Collections.singletonList(spec))
response = Retrofit.Builder()
.baseUrl(Utils().BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okttp.build())
.build().create(ApiResponse::class.java)