首页 > 解决方案 > Retrofit2 可以在 Android 4.1.2 上使用吗?我的应用程序导致由 Retrofit2 引起的致命异常

问题描述

有没有办法在较旧的 Android 版本(对我来说至少 4.x)上使用 Retrofit2?

我的应用在 Android 6 上按预期运行,但在 Android 4.1.2 上出现致命异常:

E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.ExceptionInInitializerError
        at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)
        at retrofit2.Retrofit$Builder.build(Retrofit.java:628)
        at com.example.temperaturemonitor.RESTApi.getClient(RESTApi.java:15)

这是导致错误的代码(.build 是 RESTApi.java:15):

        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl("http://192.168.1.10:5001/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }

我可以看到错误的根本原因似乎是 okhttp3。

在 build.gradle 我有

implementation 'com.squareup.retrofit2:retrofit:2.9.0'

我在https://developer.squareup.com/blog/okhttp-3-13-requires-android-5/发现“OkHttp 3.13 需要 Android 5+”。他们还维护 3.12 的 okhttp,它与 Android 4.x 兼容。我不清楚的是 Retrofit2 使用了什么版本的 okhttp(我没有将 okhttp 直接导入到我的项目中的实现行);我的假设是他们使用的是最新版本。

一旦完成,我希望能够将我的两部 Android 手机与应用程序一起使用(如果我决定发布到应用商店,那么包含早期版本会增加潜在用户)。我意识到这可能会阻止我使用一些更新的代码功能,但我可能可以忍受 - 到目前为止,我尝试过的任何事情都无法在两个版本上实现。

我的想法是,如果我可以让 Retrofit 使用 okhttp3.12 库,那么错误就不会发生。

标签: androidretrofit2okhttp

解决方案


它使用3.14.9. 你可以在文件okhttp中看到。build.gradle此外,您可以使用命令gradlew app:dependencies. 您应该在该命令的输出中看到如下内容:

+--- com.squareup.retrofit2:retrofit:2.9.0
|    \--- com.squareup.okhttp3:okhttp:3.14.9
|         \--- com.squareup.okio:okio:1.17.2

如果您想强制它使用 的版本3.12.0okhttp添加以下内容似乎可行:

implementation ('com.squareup.okhttp3:okhttp:3.12.0') {
    force = true
}

推荐阅读