预加载插页式广告

Preloading Interstitial ads

我在我的应用程序中 运行 插入了插页式广告,但我不确定如何预加载它们,以便它们在用户看来是即时的。通常它可能需要长达 10 秒,并且用户已经移动到应用程序的不同区域,这非常烦人。

这是来自应用程序的相关代码:

private void launchInterstitial() {
    interstitialAd = new InterstitialAd(this);
    interstitialAd.setAdUnitId("ca-app-pub-xxxxxxxxxxxxxxxx");

    interstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            showAdInter();
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            String message = String.format("onAdFailedToLoad (*a)", getErrorReason(errorCode));
        }

        @Override
        public void onAdClosed() {
            if (exitApp) {
                finish();
            }
        }
    });
}

private void showAdInter() {
    if (interstitialAd.isLoaded()){
        interstitialAd.show();
    } else {
        Log.d("","Interstitial ad failed to load");
    }
}

public void loadInterstitial() {
    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .addTestDevice("Fxxxxxxxxxxxxxxxxxxxxx")
            .build();

    interstitialAd.loadAd(adRequest);
}

我曾尝试在 activity 启动时调用 launchInterstitial() 和 loadInterstitial() ,然后在我希望广告出现时调用 showAdInter() ,但这种方式不起作用。

有人有什么想法吗?

无法相信没有人对此一无所知,或者不愿意提供帮助。我会 post 在这里回答,希望这能真正帮助到有需要的人。我在 onCreate() 中调用以下方法:

requestNewInterstitial();

方法如下:

private void requestNewInterstitial() {
    AdRequest adRequest = new AdRequest.Builder()
            .build();

    mInterstitialAd.loadAd(adRequest);
}

我创建了一个广告侦听器,以便在广告关闭后在后台重新加载广告:

mInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdClosed() {
            requestNewInterstitial();
        }
    });

然后我调用 requestNewInterstitial();在我的 onBackPressed() 方法上。

这会产生平滑的结果,即刻出现插页式广告。

我正在搜索 Preloading Interstitial Ads,但不幸的是我没有通过一些实验得到 this.Somehow 的完整和有效的答案,我能够实现这个机制.这是我的答案:

 public void showInterestialAd(final Context context, final String screenName){
    if (!YouTubeShareClass.getInstance().isInterestitialAdVisible) {
        if(mInterstitialAd == null) {
            mInterstitialAd = new InterstitialAd(context);
            mInterstitialAd.setAdUnitId(context.getString(R.string.interstitial_full_screen));
        }
        showInterstitial(context,screenName);
    }
}

private void showInterstitial(final Context context, final String screenName) {
    if (mInterstitialAd.isLoaded()) {
        displayAd(context,screenName);
        Toast.makeText(context,"Pre loaded",Toast.LENGTH_LONG).show();
    } else {
        AdRequest request = new AdRequest.Builder()
                    .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                    .addTestDevice("xxxxxxxxxxxxxxxxxxxxxxxxxx")
                    .build();

        mInterstitialAd.loadAd(request);
        mInterstitialAd.setAdListener(new AdListener() {
            public void onAdLoaded() {
                super.onAdLoaded();
                Toast.makeText(context,"New loaded",Toast.LENGTH_LONG).show();
                if(mInterstitialAd.isLoaded()) {
                    displayAd(context,screenName);
                }
            }
            public void onAdClosed() {
                super.onAdClosed();
                YouTubeShareClass.getInstance().isInterestitialAdVisible = false;
                YouTubeShareClass.getInstance().loadAdRequest();
            }
        });
    }
}

private void displayAd(Context context,String screen) {
    mInterstitialAd.show();
    YouTubeShareClass.getInstance().isInterestitialAdVisible = true;
}

public void loadAdRequest() {
    AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .addTestDevice("xxxxxxxxxxxxxxxxxxxxxxxxxxx")
            .build();
    mInterstitialAd.loadAd(adRequest);
    mInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            //do nothing... leave empty here...
        }
        @Override
        public void onAdClosed() {
            super.onAdClosed();
            YouTubeShareClass.getInstance().isInterestitialAdVisible = false;
            YouTubeShareClass.getInstance().loadAdRequest();
        }
    });
}

注意: - YouTubeShareClass.getInstance().isInterestitialAdVisible,变量用于注意不会同时显示两个有趣的广告,以改善用户体验。 - 当我们创建预加载的插页式广告时,制作 onAdLoaded() 方法,不要在那里做任何事情。 - 我在 Singleton class 中实现了这个方法,这就是为什么它有这样的实现。您可以根据需要更改。