我必须在 onCreate 中调用 (admob) loadAd 吗?

Posted

技术标签:

【中文标题】我必须在 onCreate 中调用 (admob) loadAd 吗?【英文标题】:Must I call (admob) loadAd in onCreate? 【发布时间】:2017-12-07 07:35:31 【问题描述】:

我正在尝试在 android 应用中使用 admob。非常简单的代码,取自示例。

@Override
public void onCreate(Bundle savedInstanceState) 

...stuff...

    MobileAds.initialize(this, "my id");
    mInterstitialAd = new InterstitialAd(this);
    mInterstitialAd.setAdUnitId("my ad unit id");

    AdRequest aRequest;
    aRequest = new AdRequest.Builder().build();
    mInterstitialAd.loadAd(aRequest);

...而且效果很好。

但是:我不想在此处使用此代码。我希望它出现在我明确表示“初始化广告”的其他地方。

当我这样做时,loadAd 每次都会崩溃。我可以成功调用它的唯一位置是在 OnCreate 中,或者在 OnCreate 中定义的回调中。这是真的,还是线程问题?游戏崩溃是因为 loadAd 阻塞了 UI 线程还是类似的原因?

我不太擅长 Java(我是一个 C++ 人)...如果这是问题所在,我怎么能把整个 shebang 扔到另一个线程中?

【问题讨论】:

崩溃日志中的错误是什么? 在 oncreate 中使用 MobileAds.initialize,之后您可以随时随地加载广告。如果你能粘贴你得到的错误,那就太好了。 【参考方案1】:

好的,我解决了我自己的问题。把它放在这里以防万一其他人需要这个解决方案。

loadAd 和 showAd 必须在 UI 线程中发生。如果你在另一个线程中调用它们,那就是崩溃。

所以,像这样包装这些调用是一件非常简单的事情:

    runOnUiThread(new Runnable()
    
        @Override
        public void run()
        
            AdRequest aRequest;
            aRequest = new AdRequest.Builder().build();
            mInterstitialAd.loadAd(aRequest);
        
    );

...并添加您可能需要的任何辅助基础设施,如果您需要该调用以同步执行。

【讨论】:

不幸的是,这阻塞了 UI 线程,但似乎没有办法解决这个问题。 @Mark,你解决了 mInterstitialAd.loadAd 的“阻塞 UI 线程”问题了吗?

以上是关于我必须在 onCreate 中调用 (admob) loadAd 吗?的主要内容,如果未能解决你的问题,请参考以下文章

AdMob 错误 - 必须在调用 loadRequest 之前设置 GADBannerView 的 rootViewController 属性:

在 android 中使用带有 admob 的完全自定义视图

在纵向方向上获取横向AdMob插页式广告

Android:如何在应用程序中集成admob?

Admob测试广告未在Android应用程序中显示

如何从静态片段中显示Admob插页式广告?