Android 谷歌播放服务广告(AdMob)显示空白框,直到准备就绪

Android 谷歌播放服务广告(AdMob)显示空白框,直到准备就绪,android,cordova,admob,google-play-services,Android,Cordova,Admob,Google Play Services,我使用GPS在我的应用程序中提供广告,但在加载广告之前,以及当用户无法访问互联网时,都会出现空白框,这看起来很糟糕。我认为这是在从专用AdMob SDK(已弃用)迁移的过程中,GPS SDK的行为发生了变化 我尝试了为onAdLoaded设置侦听器,它将可见性设置为在从我在创建之后设置的gone加载之后可见,但存在一个严重的问题。这不是在应用程序启动时显示空白框,而是在加载后显示广告。然而,当无法访问互联网时,onAdLoaded不会因为隐藏的广告而随时被解雇!同时返回这些日志: 广告不可见。不

我使用GPS在我的应用程序中提供广告,但在加载广告之前,以及当用户无法访问互联网时,都会出现空白框,这看起来很糟糕。我认为这是在从专用AdMob SDK(已弃用)迁移的过程中,GPS SDK的行为发生了变化

我尝试了为onAdLoaded设置侦听器,它将可见性设置为在从我在创建之后设置的gone加载之后可见,但存在一个严重的问题。这不是在应用程序启动时显示空白框,而是在加载后显示广告。然而,当无法访问互联网时,onAdLoaded不会因为隐藏的广告而随时被解雇!同时返回这些日志:
广告不可见。不刷新广告。
正在计划从现在起60000毫秒的ad刷新

在这种情况下,用户永远不会看到广告。。。如何防止GPS广告这样做?
主要活动中有我的代码:

        adView = new AdView(this);
        adView.setAdListener(new AdListener() {
            @Override
              public void onAdLoaded() {
                  adView.setVisibility(View.VISIBLE);
                  super.onAdLoaded();
              }
        });
        adView.setVisibility(View.GONE);
        adView.setAdUnitId("xxx");
        adView.setAdSize(AdSize.SMART_BANNER);

        layout = super.root;
        layout.addView(adView);
        adRequest = new AdRequest.Builder().build();

        adView.loadAd(adRequest);

您可以设置一个BroadcastReceiver,监听android.net.conn.CONNECTIVITY\u更改

当你再次建立网络连接时,你可以看到你的广告


或者你可以做我们其他人做的事,不必担心偶尔出现的空白通知。

我们能做的最简单的事情就是什么都不做。。。但结果是丑陋的,空白框不性感

任何事情都会改变,如果我们将“可见”adView放入一个隐藏的容器中,情况是一样的,AdMob认识到adView实际上是不可见的,所以“广告是不可见的”。不刷新广告。因此,容器是超级的

解决方案相对较长,包括在onAdFailedToLoad火灾后重新创建adView,直到加载第一个ad。我的解决方案来源于Dan Dragut发布的漂亮解决方案,我删除了容器,使代码稍微短一点,并使其与cordova兼容。我确实使用了非固定方向和使用smart_横幅大小,因此需要处理onOrientationChange事件(并重新创建adView)。这就是:

public class example extends DroidGap
{
    private Ad ad; // new ad class because of code size
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml
        super.loadUrl(Config.getStartUrl());
        appView.getSettings().setRenderPriority(RenderPriority.HIGH);
        ad = new Ad(this, super.root);
    }

    @Override
    public void onConfigurationChanged(Configuration myConfig) {
        super.onConfigurationChanged(myConfig);
        ad.restart();
    }

    @Override
    public void onPause() {
        ad.pause();
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        ad.resume();
    }

    private class Ad {
        private DroidGap mGap;
        private AdView adView;
        private LinearLayout layout;
        private AdRequest adRequest;
        private Handler handler = new Handler();

        public Ad(DroidGap _mGap, LinearLayout _layout) {
            mGap = _mGap;
            layout = _layout;
            adRequest = new AdRequest.Builder().build();
            recreate();
        }

        public void restart() {
            handler.removeCallbacksAndMessages(null);
            layout.removeView(adView);
            adView.destroy();
            this.recreate();
        }

        public void pause() {
            adView.pause();
        }

        public void resume() {
            adView.resume();
        }

        private void recreate() {
            adView = new AdView(mGap);
            adView.setAdListener(new AdListener() {
                @Override
                public void onAdLoaded() {
                    adView.setVisibility(View.VISIBLE);
                }
                @Override
                public void onAdFailedToLoad(int errorCode) {
                    //Log.e(TAG, String.format("onAdFailedToLoad(%s)", errorCode));

                // Refresh it ourselves...
                handler.removeCallbacksAndMessages(null);
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            restart();
                        }
                    }, 30000); // delay of recreating ad

                }
            });
            adView.setVisibility(View.GONE);
            adView.setAdUnitId("xxx");
            adView.setAdSize(AdSize.SMART_BANNER);
            // Lookup your LinearLayout assuming it's been given
            // the attribute android:id="@+id/mainLayout".
            // Add the adView to it.
            layout.addView(adView);
            // Initiate a generic request.
            // Load the adView with the ad request.
            adView.loadAd(adRequest);
        }
    }
}
公共类示例扩展了DroidGap
{
private Ad;//由于代码大小,新的Ad类
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//在config.xml中设置
super.loadUrl(Config.getStartUrl());
appView.getSettings().setRenderPriority(RenderPriority.HIGH);
ad=新的ad(这个,super.root);
}
@凌驾
公共无效OnConfiguration已更改(配置myConfig){
super.onConfigurationChanged(myConfig);
ad.重新启动();
}
@凌驾
公共无效暂停(){
暂停();
super.onPause();
}
@凌驾
恢复时公开作废(){
super.onResume();
广告恢复();
}
私人类广告{
私人DroidGap-mGap;
私人咨询咨询;
私人线路布局;
私人信件;
私有处理程序=新处理程序();
公共广告(DroidGap、线性布局){
mGap=_mGap;
布局=_布局;
adRequest=新建adRequest.Builder().build();
重新创建();
}
公共无效重新启动(){
handler.removeCallbacksAndMessages(null);
布局。移除视图(adView);
adView.destroy();
这个。重新创建();
}
公共空间暂停(){
暂停;
}
公众简历(){
adView.resume();
}
私有void(){
adView=新adView(mGap);
adView.setAdListener(新的AdListener(){
@凌驾
已加载的公共无效(){
adView.setVisibility(View.VISIBLE);
}
@凌驾
在失败的TOLOAD上公开无效(int错误代码){
//Log.e(TAG,String.format(“onAdFailedToLoad(%s)”,errorCode));
//自己刷新它。。。
handler.removeCallbacksAndMessages(null);
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
重启();
}
},30000);//延迟重新创建广告
}
});
adView.setVisibility(View.GONE);
咨询意见集(“xxx”);
adView.setAdSize(AdSize.SMART_BANNER);
//查找线性布局(假设已给定)
//属性android:id=“@+id/mainLayout”。
//将adView添加到其中。
layout.addView(adView);
//启动一个通用请求。
//使用ad请求加载adView。
adView.loadAd(adRequest);
}
}
}

但我还没有看到这个应用程序,它显示了一个空白的广告框。广告框将直接与广告一起出现。这是否是一个好的做法?通常情况下,当一个广告无法送达时,将继续显示上一个广告。如果你的第一个广告请求没有收到广告,那么你可能会得到一个空白的广告视图。这真的没什么可担心的。