使用Google Geocode API遇"Rate Limited Dispatcher"线程AbstractMethodError错误求助
这个错误我之前帮不少开发者排查过,核心原因就是Google Maps Java客户端库和OkHttp依赖的版本不兼容,导致内部回调方法的签名不匹配,JVM找不到正确的实现,才抛出了AbstractMethodError。
具体来说,com.google.maps.internal.OkHttpPendingResult$1.onResponse(Lokhttp3/Response;)V这个错误提示,说明Google Maps内部封装的OkHttp回调方法,和你项目里实际引入的OkHttp版本中的方法签名不一致——比如OkHttp 3.x和4.x之间的方法有变动,而Google Maps客户端依赖的版本和你项目里的版本不统一,就会出现这种问题。
下面是具体的解决步骤:
第一步:确认依赖版本兼容性
先查清楚你用的google-maps-services版本对应的OkHttp版本要求。比如最新的2.2.0版本需要OkHttp 4.x,而旧版本(比如v0.16.x)依赖的是OkHttp 3.x。如果混用了跨大版本的OkHttp,肯定会出问题。第二步:统一项目中的依赖版本
不管用Maven还是Gradle,都要明确指定OkHttp的版本,确保和Google Maps客户端的依赖一致:- Maven(pom.xml):
<!-- 先指定兼容的OkHttp版本 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.10.0</version> </dependency> <!-- 引入Google Maps Geocode客户端 --> <dependency> <groupId>com.google.maps</groupId> <artifactId>google-maps-services</artifactId> <version>2.2.0</version> </dependency> - Gradle(build.gradle):
dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.google.maps:google-maps-services:2.2.0' }
- Maven(pom.xml):
第三步:排除冲突的依赖
如果项目里其他第三方依赖偷偷引入了不同版本的OkHttp,需要把这些冲突的依赖排除掉。比如Maven中给Google Maps客户端添加排除规则:<dependency> <groupId>com.google.maps</groupId> <artifactId>google-maps-services</artifactId> <version>2.2.0</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </exclusion> </exclusions> </dependency>第四步:清理缓存并重新构建
有时候本地缓存的旧依赖会干扰,执行清理命令重新构建:- Maven:
mvn clean install - Gradle:
./gradlew clean build
- Maven:
你提到错误出现在GeocodingResult[]...那一行,是因为当调用Geocode API发起请求时,内部会触发OkHttp的回调,而此时版本不兼容导致回调方法找不到,才抛出了这个错误。按照上面的步骤调整依赖版本,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Jean

