You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android项目Retrofit+OkHttp请求崩溃:NoSuchMethodError问题求助

解决Retrofit+OkHttp请求时的NoSuchMethodError崩溃问题

看起来你遇到的是典型的OkHttp版本冲突导致的方法找不到问题,我来一步步帮你分析和解决:

问题根源

崩溃日志里的java.lang.NoSuchMethodError: No virtual method toString(Z)Ljava/lang/String; in class Lokhttp3/Cookie;说明:

  • 你的代码/依赖(这里是JavaNetCookieJar)试图调用OkHttp的Cookie.toString(boolean)方法,但当前加载的okhttp3.Cookie类并没有这个方法。
  • 这个方法是在OkHttp 4.x版本中新增的,而你的项目里大概率存在多个版本的OkHttp共存(比如React Native内置的OkHttp版本低于你引入的4.4.0),类加载器优先加载了旧版本的Cookie类,导致方法缺失。

解决方案

1. 检查依赖冲突

先执行Gradle命令查看项目的依赖树,找出引入旧版OkHttp的依赖:

./gradlew app:dependencies

在输出中搜索okhttp,看是否有版本号低于4.4.0的条目,尤其是React Native相关的依赖可能会自带旧版OkHttp。

2. 强制统一OkHttp版本

在你的模块级build.gradle(一般是app/build.gradle)中添加配置,强制所有依赖使用你指定的OkHttp版本:

configurations.all {
    // 强制所有依赖使用4.4.0版本的OkHttp核心库
    resolutionStrategy.force "com.squareup.okhttp3:okhttp:4.4.0"
    // 同步强制OkHttp相关扩展库的版本
    resolutionStrategy.force "com.squareup.okhttp3:okhttp-tls:4.4.0"
    resolutionStrategy.force "com.squareup.okhttp3:logging-interceptor:4.4.0"
}

这样可以确保整个项目中只会加载你指定的4.4.0版本的OkHttp类,避免版本不一致的问题。

3. 清理并重建项目

依赖版本修改后,一定要清理项目缓存并重新构建,避免旧的类文件残留:

./gradlew clean
./gradlew assembleDebug

4. 确认Retrofit与OkHttp的兼容性

你使用的Retrofit 2.7.2是完全兼容OkHttp 4.4.0的,这一组版本搭配没有问题,不需要调整Retrofit的版本。

额外说明

你的项目中同时使用了React Native的ReactCookieJarContainer,这个类依赖于OkHttp的CookieJar实现,所以RN内置的OkHttp版本和你手动引入的版本必须保持一致,否则就会出现这种跨版本的方法调用错误。强制版本统一是解决这类问题最直接有效的方式。

内容的提问来源于stack exchange,提问作者A B

火山引擎 最新活动