
在Android中使用Google Play Games API提交排行榜分数时,addOnSuccessListener和addOnFailureListener的调用顺序本身合法,但编译报错“Cannot resolve method”根本原因在于submitScore()返回的是Task,而后续链式调用需严格匹配方法签名——错误常源于API版本变更导致返回类型不一致或误用已弃用方法。
在android中使用google play games api提交排行榜分数时,`addonsuccesslistener`和`addonfailurelistener`的调用顺序本身合法,但编译报错“cannot resolve method”根本原因在于`submitscore()`返回的是`task
问题根源:API 返回类型变更与方法弃用
从 Google Play Services 21.0.0 版本起,Games.getLeaderboardsClient(...).submitScore(...) 方法已被标记为弃用(@Deprecated),其返回类型不再是标准的 Task
你观察到“哪个监听器写在前面就报哪个错”,本质并非顺序问题,而是 submitScore() 调用后返回的对象类型不支持链式监听器注册。无论 .addOnSuccessListener 还是 .addOnFailureListener 放在前面,只要调用对象不具备对应方法,就会触发 Cannot resolve method 错误。
正确解决方案:使用 submitScoreImmediate() 并适配新返回类型
推荐改用 submitScoreImmediate(String leaderboardId, long score) 方法,它明确返回 Task
public void submitLeaderboardScore(long score) {
if (GoogleSignIn.getLastSignedInAccount(this) == null) {
Log.e("Leaderboard", "User not signed in");
return;
}
leaderboardsClient = Games.getLeaderboardsClient(this,
Objects.requireNonNull(GoogleSignIn.getLastSignedInAccount(this)));
// ✅ 正确:使用 submitScoreImmediate(),返回 Task<scoresubmissiondata>
leaderboardsClient.submitScoreImmediate(getString(R.string.leaderboard_id), score)
.addOnSuccessListener(new OnSuccessListener<scoresubmissiondata>() {
@Override
public void onSuccess(ScoreSubmissionData data) {
Log.d("Leaderboard", "Score submitted successfully: " + data.getScore());
// 可选:更新 UI,显示成功提示
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e("Leaderboard", "Failed to submit score", e);
// 处理网络异常、权限拒绝、未登录等错误
}
});
}</scoresubmissiondata></scoresubmissiondata>
? 注意:ScoreSubmissionData 包含提交结果详情(如 getScore()、getRank()),比旧版 Void 更具实用性。
关键注意事项
- ✅ 必须确保 Google Sign-In 已完成:GoogleSignIn.getLastSignedInAccount(context) 返回 null 时调用会崩溃,务必提前校验。
- ✅ 依赖版本需统一:在 app/build.gradle 中声明兼容版本(推荐 com.google.android.gms:play-services-games:23.1.0 或更高稳定版):
implementation 'com.google.android.gms:play-services-games:23.1.0'
- ⚠️ 避免混用旧/新 API:submitScore()(弃用)与 submitScoreImmediate()(推荐)行为不同——后者立即提交(不缓存),更适合实时反馈场景。
- ? 建议升级至 Kotlin + 协程:现代开发更推荐使用 await() 封装 Task,提升可读性与错误处理能力:
try { val result = leaderboardsClient.submitScoreImmediate(leaderboardId, score).await() Log.d("Leaderboard", "Success: ${result.score}") } catch (e: Exception) { Log.e("Leaderboard", "Submit failed", e) }
总结
监听器链式调用失败,从来不是“谁先谁后”的语法问题,而是底层 Task 返回类型与监听器方法签名不匹配所致。根本解法是:停用已弃用的 submitScore(),改用类型明确、官方推荐的 submitScoreImmediate(),并严格匹配泛型参数(如
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











