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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:47:17