Android端如何处理AdMob的onAdFailedToLoad回调解决弹窗无限加载问题
解决方案
问题根因
- 你目前只在广告加载成功的
onAdLoaded回调中关闭了加载弹窗,加载失败的onAdFailedToLoad回调中没有对应的关闭逻辑,因此网络异常、广告填充不足等场景下弹窗会永久展示 - 现有逻辑存在时序问题:点击按钮后直接触发了休息/跳过休息的业务逻辑,和广告加载流程并行,不符合插屏广告的常规交互逻辑(用户看完广告再进入对应功能)
具体修改方案
1. 补全onAdFailedToLoad的处理逻辑
在广告加载失败回调中关闭弹窗,同时直接执行业务兜底逻辑,保证用户操作不会被阻断
2. 调整业务逻辑触发时序
将原来点击按钮时直接执行的业务逻辑,调整到广告关闭回调、以及广告加载失败的场景中触发
3. 可选优化
- 增加网络预判断:无网时直接跳过广告流程,避免用户无意义等待
- 去掉2秒加载延迟:减少用户点击后的等待时长
- 提前预加载广告:可以在页面初始化时就加载好插屏广告,用户点击时直接展示,进一步提升体验
修改后的参考代码
首先定义操作类型变量,统一处理业务逻辑:
// 存储用户点击的按钮对应的操作类型,1=短休息,2=长休息,3=跳过休息 private int currentAdActionType = 0; // 统一执行业务逻辑的方法 private void executeUserAction() { switch (currentAdActionType) { case 1: start_Break_From_Alert_Popup(start_short_break.getText().toString()); break; case 2: start_Break_From_Alert_Popup(start_long_break.getText().toString()); break; case 3: sessionCancel(HomeActivity.this, preferences); break; } currentAdActionType = 0; } // 网络判断工具方法,不需要可以直接删除 private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); }
修改广告初始化方法,补全失败和广告关闭回调:
private void init_Interstitial_ads() { InterstitialAd.load(this, "ca-app-pub-9852745157515787/5999732991", adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; // 加载成功先关闭加载弹窗 loadingDialog.dismiss_loadingDialog(); // 设置广告展示相关回调 mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){ @Override public void onAdDismissedFullScreenContent() { // 用户关闭广告后执行业务逻辑 executeUserAction(); mInterstitialAd = null; } @Override public void onAdFailedToShowFullScreenContent(AdError adError) { // 广告展示失败也正常执行业务逻辑 mInterstitialAd = null; executeUserAction(); } }); mInterstitialAd.show(HomeActivity.this); } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; // 加载失败关闭弹窗,直接执行业务逻辑 loadingDialog.dismiss_loadingDialog(); executeUserAction(); } }); }
修改广告触发方法,增加网络判断:
void userAdPromt() { // 无网直接走兜底逻辑,不需要加载广告 if(!isNetworkAvailable()) { loadingDialog.dismiss_loadingDialog(); executeUserAction(); return; } // 如果觉得2秒等待太长可以直接去掉延迟,直接调用init_Interstitial_ads() new Handler().postDelayed(new Runnable() { @Override public void run() { init_Interstitial_ads(); } }, 2000); }
修改三个按钮的点击逻辑,仅标记操作类型,不直接执行业务逻辑:
start_short_break.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadingDialog.start_loadingDialog(); currentAdActionType = 1; userAdPromt(); } }); start_long_break.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadingDialog.start_loadingDialog(); currentAdActionType = 2; userAdPromt(); } }); skipBreakSmallButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadingDialog.start_loadingDialog(); currentAdActionType = 3; userAdPromt(); } });
如果使用了上面的网络判断方法,需要在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Ishtiaq Ali Chughtai
相关产品推荐
相关产品推荐

