You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何依次检查广告加载状态?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) {
        // 可添加数据库错误处理逻辑,比如打印错误信息
    }
});

补充说明

  1. 判空处理:先判断广告实例是否为null,再检查加载状态,避免空指针异常。
  2. 预加载逻辑:建议在页面初始化阶段提前预加载广告,不要等到数据库回调时才加载,这样能提升广告可用率。
  3. 移除无效switch:原switch依赖固定值,完全无法实现顺序检查需求,用if-else顺序判断更直观高效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:23