如何依次检查广告加载状态?Switch Case仅执行首个广告块问题排查
问题描述
我的数据库结构如下:
需求逻辑:若第一个广告块已加载,则停止检查并执行该广告;若未加载,则检查第二个广告块,若已加载则停止检查并执行;若第二个也未加载,则检查第三个。
我尝试通过Switch Case实现该逻辑,但目前仅第一个广告块会被执行,恳请帮忙排查问题原因。
mDatabase = FirebaseDatabase.getInstance().getReference("Reklama"); mDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // Switch between video ads and interstitial ads. if Reklama == 1 -> Interstitial / if Reklama == 2 -> Video. int Reklama = Math.toIntExact((Long) snapshot.getValue()); //ad matching cycle if (Reklama == 1) { final int adUnit1 = 1; final int adUnit2 = 2; final int adUnit3 = 3; int ReklamaInt = 1; switch (ReklamaInt) { case adUnit1: mInterstitialAd.loadAd(adRequest); break; case adUnit2: mInterstitialAdMid.loadAd(adRequest); break; case adUnit3: mInterstitialAdLow.loadAd(adRequest); break; default: throw new IllegalStateException("Unexpected value: " + ReklamaInt); } } //ad matching cycle else if (Reklama == 2) { final int adUnit1 = 1; final int adUnit2 = 2; final int adUnit3 = 3; int ReklamaReward = 1; switch (ReklamaReward){ case adUnit1: mRewardedAd.loadAd(adRequest); break; case adUnit2: mRewardedAdMid.loadAd(adRequest); break; case adUnit3: mRewardedAdLow.loadAd(adRequest); break; default: throw new IllegalStateException("Unexpected value: " + ReklamaReward); } } } @Override public void onCancelled(@NonNull DatabaseError error) { } });
问题原因与解决方法
核心问题
你的代码完全没实现「检查广告是否已加载」的判断逻辑,反而固定将ReklamaInt和ReklamaReward赋值为1,导致switch语句永远只会匹配第一个case,自然只会执行第一个广告块的加载操作。
修正思路
要达成需求,需要按顺序判断每个广告的加载状态,找到第一个已加载的广告后执行,否则继续检查下一个;若所有广告都未加载,可选择预加载第一个或做其他兜底处理。
修正后的代码示例
mDatabase = FirebaseDatabase.getInstance().getReference("Reklama"); mDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { int Reklama = Math.toIntExact((Long) snapshot.getValue()); if (Reklama == 1) { // 按顺序检查插屏广告加载状态,执行第一个已加载的广告 if (mInterstitialAd != null && mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } else if (mInterstitialAdMid != null && mInterstitialAdMid.isLoaded()) { mInterstitialAdMid.show(); } else if (mInterstitialAdLow != null && mInterstitialAdLow.isLoaded()) { mInterstitialAdLow.show(); } else { // 所有广告未加载时,预加载第一个广告 mInterstitialAd.loadAd(adRequest); } } else if (Reklama == 2) { // 激励视频广告按同样逻辑处理 if (mRewardedAd != null && mRewardedAd.isLoaded()) { mRewardedAd.show(); } else if (mRewardedAdMid != null && mRewardedAdMid.isLoaded()) { mRewardedAdMid.show(); } else if (mRewardedAdLow != null && mRewardedAdLow.isLoaded()) { mRewardedAdLow.show(); } else { mRewardedAd.loadAd(adRequest); } } } @Override public void onCancelled(@NonNull DatabaseError error) { // 可添加数据库错误处理逻辑,比如打印错误信息 } });
补充说明
- 判空处理:先判断广告实例是否为null,再检查加载状态,避免空指针异常。
- 预加载逻辑:建议在页面初始化阶段提前预加载广告,不要等到数据库回调时才加载,这样能提升广告可用率。
- 移除无效switch:原switch依赖固定值,完全无法实现顺序检查需求,用if-else顺序判断更直观高效。
内容的提问来源于stack exchange,提问作者ploxo
相关产品推荐
相关产品推荐

