使用Retrofit调用API时出现OkHttp Dispatcher致命异常,启用Java8无效
解决Retrofit + OkHttp的BootstrapMethodError异常(ClassCastException: Bootstrap method returned null)
我之前也遇到过一模一样的异常,折腾了好一会儿才解决。结合你的情况(minSDK 26、已启用Java 8),这个BootstrapMethodError通常和Retrofit/OkHttp的版本兼容性、编译配置或者混淆规则有关,下面是几个你可以尝试的解决方案:
1. 确保Retrofit与OkHttp版本兼容且为稳定版
旧版本的Retrofit在Java 8环境下的字节码处理可能存在bug,建议升级到最新的稳定版本,并且保证Retrofit和OkHttp的版本匹配(比如Retrofit 2.9.0+搭配OkHttp 4.9.0+)。在你的Module级build.gradle中更新依赖:
dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0' // 如果使用Gson转换器,同步版本 implementation 'com.squareup.retrofit2:converter-gson:2.9.0' }
2. 检查Java 8编译配置是否完整
虽然你提到已启用Java 8,但有时候配置可能不完整。确保你的Module级build.gradle配置如下:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // 若项目包含Kotlin代码,需添加以下配置 kotlinOptions { jvmTarget = "1.8" } }
3. 添加正确的ProGuard/R8混淆规则(若开启混淆)
如果应用开启了混淆,Retrofit和OkHttp的核心类被混淆后会导致反射调用失败,进而触发该异常。在proguard-rules.pro中添加以下规则:
# Retrofit 混淆规则 -keep class retrofit2.** { *; } -keep interface retrofit2.** { *; } -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } # OkHttp 混淆规则 -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -dontwarn okhttp3.** -dontwarn okio.**
4. 排查并解决依赖冲突
第三方库可能会引入旧版本的OkHttp或Retrofit,导致版本冲突。执行以下命令查看依赖树:
# Mac/Linux ./gradlew app:dependencies # Windows gradlew.bat app:dependencies
找到冲突的版本后,在build.gradle中强制统一版本:
configurations.all { resolutionStrategy { force 'com.squareup.okhttp3:okhttp:4.10.0' force 'com.squareup.retrofit2:retrofit:2.9.0' } }
额外检查点
如果以上方法都无效,检查你的ServiceGenerator类中OkHttpClient的初始化代码,确认是否使用了过时API或存在错误配置(比如自定义拦截器未处理异常)。
内容的提问来源于stack exchange,提问作者johnzilla
相关产品推荐
相关产品推荐

