Android中AdMob插页式广告接入RecyclerView后点击一次失效怎么解决?
AdMob插页广告二次点击无响应问题修复方案
问题根因
- AdMob插页广告是一次性使用对象,单次展示完成后就会失效,原有代码仅在Adapter初始化时加载了一次广告,首次展示后没有新的广告实例,第二次点击时
mInterstitialAd为空,没有对应逻辑执行 - 未处理广告未加载完成的点击场景,用户点击时如果广告还未加载完成会直接无响应
- 广告回调设置时机不规范,存在时序异常风险
- 广告逻辑与列表适配器耦合过重,不符合职责分离规范
修复后代码
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> { private Context mContext; private List<Anime> mData ; RequestOptions option; private InterstitialAd mInterstitialAd; public RecyclerViewAdapter(Context mContext, List<Anime> mData) { this.mContext = mContext; this.mData = mData; // 建议将MobileAds初始化移动到Application onCreate中,避免重复初始化 MobileAds.initialize(mContext, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) { } }); // 初始化时加载首次广告 loadInterstitialAd(); // Request option for Glide option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape); } // 抽离广告加载逻辑,方便后续复用调用 private void loadInterstitialAd() { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(mContext,"ca-app-pub-3940256099942544/1033173712", adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; } }); } // 抽离跳转逻辑,避免重复代码 private void gotoWebActivity(int position) { Intent i = new Intent(mContext, WebViewActivity.class); i.putExtra("action_link",mData.get(position).getWebsite_link()); i.putExtra("puzzle_link",mData.get(position).getWebsite_link()); i.putExtra("arcade_link",mData.get(position).getWebsite_link()); i.putExtra("adventure_link",mData.get(position).getWebsite_link()); i.putExtra("sports_link",mData.get(position).getWebsite_link()); i.putExtra("racing_link",mData.get(position).getWebsite_link()); i.putExtra("zombie_link",mData.get(position).getWebsite_link()); mContext.startActivity(i); CustomIntent.customType(mContext,"fadein-to-fadeout"); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.row_items,parent,false); final MyViewHolder viewHolder = new MyViewHolder(view) ; viewHolder.view_container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = viewHolder.getAdapterPosition(); // 校验位置合法性,避免条目移除后下标越界 if (position == RecyclerView.NO_POSITION) { return; } view.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.clcik)); if (mInterstitialAd != null) { // 先设置回调再展示广告,避免时序问题 mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent(); mInterstitialAd = null; // 广告关闭后重新加载下一次广告 loadInterstitialAd(); gotoWebActivity(position); } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { super.onAdFailedToShowFullScreenContent(adError); // 广告展示失败也直接跳转,不阻塞用户操作 mInterstitialAd = null; loadInterstitialAd(); gotoWebActivity(position); } }); mInterstitialAd.show((Activity) mContext); } else { // 广告未加载完成直接跳转,不影响用户使用 gotoWebActivity(position); // 预加载广告,下次点击可使用 loadInterstitialAd(); } } }); return viewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Glide.with(mContext).load(mData.get(position).getWebsite_logo()).apply(option).into(holder.img_thumbnail); } @Override public int getItemCount() { return mData.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { ImageView img_thumbnail; LinearLayout view_container; public MyViewHolder(View itemView) { super(itemView); view_container = itemView.findViewById(R.id.container); img_thumbnail = itemView.findViewById(R.id.thumbnail); } } }
额外优化建议
- 将MobileAds初始化逻辑移动到Application类的onCreate方法中,避免重复初始化
- 可根据产品需求配置广告展示频率,避免每一次点击都展示广告影响用户体验
- 上线前记得将测试广告ID替换为正式ID
内容的提问来源于stack exchange,提问作者Litu
相关产品推荐
相关产品推荐

