Admob插屏广告设置Ad Unit ID时触发IllegalStateException原因排查
我来帮你分析下这个IllegalStateException的常见原因,结合你在Application类中管理InterstitialAd的场景,主要有这几个可能性:
Google Mobile Ads SDK未完成初始化就调用setAdUnitId
这是最常见的原因。InterstitialAd的配置方法(比如setAdUnitId)必须在Mobile Ads SDK完全初始化之后调用。如果你在Application的onCreate里直接创建InterstitialAd实例并设置adUnitId,而没有先初始化SDK,就会触发这个异常。解决办法是先调用
MobileAds.initialize(),在初始化完成的回调里再去配置你的InterstitialAd:public class MyCustomApplication extends Application { public InterstitialAd interstitialAd; @Override public void onCreate() { super.onCreate(); // 先初始化SDK,等待回调确认完成 MobileAds.initialize(this, initializationStatus -> { // 这里才安全创建并配置InterstitialAd interstitialAd = new InterstitialAd(this); interstitialAd.setAdUnitId("你的广告单元ID"); // 可选:立即加载广告 AdRequest adRequest = new AdRequest.Builder().build(); interstitialAd.loadAd(adRequest); }); } }重复调用setAdUnitId方法
InterstitialAd实例不允许重复设置adUnitId。如果你的代码中(比如某个Activity里)再次调用了interstitialAd.setAdUnitId(),哪怕是同一个ID,也会抛出IllegalStateException。检查一下你的代码逻辑,确保每个InterstitialAd实例只调用一次setAdUnitId。上下文传递错误
虽然你是在Application类中创建实例,但如果创建InterstitialAd时传入的上下文无效(比如不小心传了null,或者在非Application/Activity的上下文环境中创建),也可能触发这个异常。确保你创建实例时传入的是this(Application的上下文),这个是有效的。
另外补充一点:虽然把InterstitialAd放在Application类里可以实现跨Activity访问,但要注意广告展示的时机——必须在活跃的Activity中调用show()方法,否则也会引发其他异常。不过这和你当前遇到的setAdUnitId异常无关,只是个额外提醒~
内容的提问来源于stack exchange,提问作者Asim Khan

