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

Android中能否预加载多个不同请求的AdManager插屏广告?

关于预加载多个AdManager插屏广告的解决方案

可以预加载多个AdManagerInterstitialAd实例,按需逐一展示,但需要遵守广告平台的规则和一些最佳实践,避免出现问题:

核心说明

Google Ad Manager(含AdMob)支持预加载多个插屏广告,但每个广告实例只能展示一次,展示后必须重新加载新的实例。同时不要过度预加载,否则会占用过多内存,甚至触发平台的频率限制,一般预加载对应路由数量的广告即可,或者控制在2-3个的合理范围。

实现思路

  • 用一个映射表(比如HashMap<String, AdManagerInterstitialAd>)来存储预加载的广告,键设为路由标识,值是对应的广告实例。
  • 在应用启动、进入首页等时机,根据5个路由的不同AdRequest配置,分别调用加载方法,把成功加载的广告存入映射表。
  • 用户进入某路由时,从映射表取出对应广告:
    • 如果广告有效(未展示、未过期),直接调用show()展示;
    • 如果广告无效(加载失败、已展示过),立刻触发该路由的广告重新加载,保证下次进入时有可用广告。

关键注意事项

  • 广告过期:插屏广告有有效期(通常数小时),长时间未展示会失效,展示时会触发失败回调。建议展示前检查状态,或者设置定时刷新,定期重新加载过期广告。
  • 内存管理:每个广告实例会占用内存,预加载过多可能导致低配置设备内存不足。要及时清理已展示或失效的实例,避免内存泄漏。
  • 回调处理:每个广告的FullScreenContentCallback要独立处理,比如广告关闭后,从映射表移除该实例并重新加载对应路由的广告,维持预加载池的可用性。

示例代码参考

// 存储预加载广告的映射表
private HashMap<String, AdManagerInterstitialAd> preloadedAds = new HashMap<>();

// 预加载所有路由的广告
private void preloadAllAds() {
    // 路由1的专属AdRequest
    AdManagerAdRequest request1 = new AdManagerAdRequest.Builder()
            .addKeyword("travel")
            .build();
    loadAdForRoute("route1", request1);

    // 路由2的专属AdRequest
    AdManagerAdRequest request2 = new AdManagerAdRequest.Builder()
            .addKeyword("food")
            .build();
    loadAdForRoute("route2", request2);

    // 依次处理路由3、4、5的广告加载...
}

// 加载指定路由的广告
private void loadAdForRoute(String routeId, AdManagerAdRequest request) {
    AdManagerInterstitialAd.load(
            this,
            "your_ad_unit_id", // 如果每个路由有独立广告位ID,替换成对应值
            request,
            new AdManagerInterstitialAdLoadCallback() {
                @Override
                public void onAdLoaded(@NonNull AdManagerInterstitialAd ad) {
                    preloadedAds.put(routeId, ad);
                    // 设置广告展示后的回调逻辑
                    ad.setFullScreenContentCallback(new FullScreenContentCallback() {
                        @Override
                        public void onAdDismissedFullScreenContent() {
                            // 广告关闭后,移除已展示实例并重新加载
                            preloadedAds.remove(routeId);
                            loadAdForRoute(routeId, request);
                        }

                        @Override
                        public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                            // 展示失败,清理失效实例并重新加载
                            preloadedAds.remove(routeId);
                            loadAdForRoute(routeId, request);
                        }
                    });
                }

                @Override
                public void onAdFailedToLoad(@NonNull LoadAdError adError) {
                    // 加载失败,可记录日志或稍后重试
                }
            });
}

// 进入路由时展示对应广告
private void showAdForRoute(String routeId) {
    AdManagerInterstitialAd ad = preloadedAds.get(routeId);
    if (ad != null) {
        ad.show(this);
    } else {
        // 没有预加载广告,立即加载并尝试展示
        AdManagerAdRequest request = getAdRequestForRoute(routeId);
        loadAdForRoute(routeId, request);
        // 若需要立即展示,可在onAdLoaded回调中直接调用ad.show(this)
    }
}

// 根据路由获取对应的AdRequest
private AdManagerAdRequest getAdRequestForRoute(String routeId) {
    switch (routeId) {
        case "route1":
            return new AdManagerAdRequest.Builder().addKeyword("travel").build();
        case "route2":
            return new AdManagerAdRequest.Builder().addKeyword("food").build();
        // 其他路由的AdRequest配置...
        default:
            return new AdManagerAdRequest.Builder().build();
    }
}

内容的提问来源于stack exchange,提问作者Saraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:17:26