Android应用中Google AdMob激励广告无法加载问题求助
AdMob激励广告加载失败:ExoPlayer线程错误排查与解决
问题现象
- 集成AdMob激励广告后,点击触发按钮无任何反应
- 日志抛出
Player is accessed on the wrong thread错误,当前线程为AdWorker(Default) #17,要求必须在主线程操作 - 广告加载最终返回
Internal error(错误码0)
关键日志片段
W/Ads: Failed to preload url ... Exception: Player is accessed on the wrong thread. Current thread: 'AdWorker(Default) #17' Expected thread: 'main' D/RaffleActivity: { "Code": 0, "Message": "Internal error.", "Domain": "com.google.android.gms.ads", "Cause": "null", ... }
当前使用的广告加载代码
MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); AdRequest adRequest = new AdRequest.Builder().build(); RewardedAd.load(this, "ca-app-pub-3940256099942544/5224354917", adRequest, new RewardedAdLoadCallback() { @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { Log.d(TAG, loadAdError.toString()); mRewardedAd = null; } @Override public void onAdLoaded(@NonNull RewardedAd rewardedAd) { super.onAdLoaded(rewardedAd); mRewardedAd=rewardedAd; Log.i(TAG, "ad loaded"); rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdClicked() { super.onAdClicked(); } @Override public void onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent(); mRewardedAd=null; } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { super.onAdFailedToShowFullScreenContent(adError); Log.i(TAG, "Failed to show fullscreen ad"); mRewardedAd=null; } @Override public void onAdImpression() { super.onAdImpression(); } @Override public void onAdShowedFullScreenContent() { super.onAdShowedFullScreenContent(); } }); } });
排查与解决步骤
1. 强制广告展示逻辑在主线程执行
你尝试过将加载代码放入runOnUiThread,但更关键的是广告展示的代码(即点击按钮后调用show()的逻辑)必须严格在主线程执行。检查按钮点击事件处理:
yourAdTriggerButton.setOnClickListener(v -> { if (mRewardedAd != null) { runOnUiThread(() -> { mRewardedAd.show(RaffleActivity.this, rewardItem -> { // 这里处理用户观看广告后的奖励逻辑 }); }); } });
2. 排查ExoPlayer依赖冲突
AdMob视频广告依赖ExoPlayer,若项目中手动引入了ExoPlayer,易出现版本冲突:
- 直接移除项目中手动添加的ExoPlayer依赖,让AdMob SDK自动管理其依赖的ExoPlayer版本
- 若必须手动引入,确保版本与当前AdMob SDK兼容(建议参考官方文档对应版本)
3. 优化广告初始化与加载时机
- 不要在
onCreate中立即加载广告,建议在onStart或onResume中执行,确保Activity处于活跃生命周期 - 等待MobileAds初始化完成后再加载广告:
MobileAds.initialize(this, initializationStatus -> { // 初始化完成后再执行广告加载 loadRewardedAd(); }); // 单独封装广告加载方法 private void loadRewardedAd() { AdRequest adRequest = new AdRequest.Builder().build(); RewardedAd.load(this, "ca-app-pub-3940256099942544/5224354917", adRequest, new RewardedAdLoadCallback() { // 保持原有的回调实现 }); }
4. 确认测试广告配置正确性
你使用的是AdMob测试ID,需确保:
- 测试设备已通过
AdRequest.Builder().addTestDevice("你的设备ID")正确添加 - 设备网络环境可正常访问Google广告服务
5. 更新AdMob SDK版本
日志显示当前使用的dynamite版本为231004600,尝试更新到最新版AdMob SDK,线程相关bug可能已被修复:
implementation 'com.google.android.gms:play-services-ads:23.4.0' // 替换为官方最新版本号
内容的提问来源于stack exchange,提问作者Nathanael Primeldi
相关产品推荐
相关产品推荐

