如何修复Android Studio中AdMob激励广告预加载代码的异常报错
AdMob激励广告集成报错修复方案
三类报错的对应根因与修复
- 第一组关联报错(方法定义行报
';' expected、return行报cannot return value from a method with a void result type)
这两个报错为连锁触发:根本原因是createAndLoadRewardedAd()方法被误嵌套写在了onCreate()方法的内部代码块中。Java语法不允许在普通成员方法内定义另一个独立的带返回值方法,编译器会把方法定义的整行识别成普通执行语句,因此抛出缺少分号的语法错误;同时编译器会将方法内的return rewardedAd;语句判定为属于void返回类型的onCreate()方法,因此抛出“不能从void返回类型方法返回值”的错误。
修复方式:将整段createAndLoadRewardedAd()方法代码从onCreate()方法的大括号内移出,放置到MainActivity类的成员层级,与onCreate()、按钮点击监听逻辑平级。 - 第三类报错(广告关闭回调行报
cannot resolve symbol 'rewardedAd')
触发原因有两点:一是代码没有在MainActivity类的成员层级全局声明rewardedAd变量,仅在createAndLoadRewardedAd()方法内定义了同名局部变量,外部作用域无法访问;二是代码中使用的this指向当前匿名内部类RewardedAdCallback的实例,并非MainActivity对象本身,自然找不到对应的成员变量。
修复方式:- 在MainActivity类的变量声明区域(类内、所有方法定义之外)添加成员变量声明:
private RewardedAd rewardedAd; - 将广告关闭回调内的赋值代码从
this.rewardedAd = createAndLoadRewardedAd();修改为MainActivity.this.rewardedAd = createAndLoadRewardedAd();,明确指向外部Activity的全局成员变量。
- 在MainActivity类的变量声明区域(类内、所有方法定义之外)添加成员变量声明:
修正后的核心可编译代码参考:
// MainActivity类的成员变量区域(所有方法外部) private RewardedAd rewardedAd; private int score = 0; private final int fivehundred = 500; // 与onCreate方法平级的成员方法 public RewardedAd createAndLoadRewardedAd() { RewardedAd ad = new RewardedAd(this, "ca-app-pub-9041707305654469/8828610380"); RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() { @Override public void onRewardedAdLoaded() { Log.d("TAG", "The rewarded ad loaded"); } @Override public void onRewardedAdFailedToLoad(LoadAdError adError) { Log.d("TAG", "The rewarded ad failed to load, error: " + adError); } }; ad.loadAd(new AdRequest.Builder().build(), adLoadCallback); return ad; } // onCreate方法内的逻辑 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 进入页面即预加载激励广告 rewardedAd = createAndLoadRewardedAd(); btn1 = (Button) findViewById(R.id.button); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (rewardedAd.isLoaded()) { Activity activityContext = MainActivity.this; RewardedAdCallback adCallback = new RewardedAdCallback() { @Override public void onRewardedAdOpened() { Log.d("TAG", "The rewarded ad opened"); } @Override public void onRewardedAdClosed() { // 明确指向外部Activity的成员变量 MainActivity.this.rewardedAd = createAndLoadRewardedAd(); Log.d("TAG", "the reward ad closed"); } @Override public void onUserEarnedReward(@NonNull RewardItem reward) { TextView tvscore = (TextView) findViewById(R.id.scoretextView); score = score + fivehundred; tvscore.setText(String.valueOf(score)); Log.d("TAG", "user earned reward"); } @Override public void onRewardedAdFailedToShow(AdError adError) { Log.d("TAG", "The rewarded ad failed to show."); } }; rewardedAd.show(activityContext, adCallback); } else { Log.d("TAG", "The rewarded ad wasn't loaded yet."); } } }); }
带编译报错的应用能否直接上传Google Play
无法实现。
只要Android Studio存在红色编译报错,项目的Release签名AAB/APK构建流程会直接中断,根本无法生成可上传的安装包文件。即使通过修改Gradle配置强行跳过错误完成打包,生成的安装包也会存在运行时类加载失败、功能点击直接崩溃的问题,无法通过Google Play的上架前置检测流程,甚至会触发开发者账号的合规风险记录。
内容的提问来源于stack exchange,提问作者alexb_1735
相关产品推荐
相关产品推荐

