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

标签 java android multithreading crash admob

我正在尝试在 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 扔到另一个线程中?

最佳答案

好的,我解决了我自己的问题。将其放在这里供后代使用,以防其他人需要此解决方案。

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

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

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

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

关于java - 我必须在 onCreate 中调用 (admob) loadAd 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895632/

相关文章:

java - 线程中的 Stop() 方法?

java - 更新 AsyncTask 内的 ArrayAdapter 的有效方法?

android - 为我的 HTC 设备构建 AOSP

c++ - 我怎样才能用阻塞写入cout?

c# - 将参数传递给 Backgroundworker 错误处理程序

java - 如何为 java keytool 设置默认语言?

java - 比较和对比 Java 和 Delphi 中的接口(interface)

android - 只更新一个 AppWidget 实例

android - 如何从 adb 在 Android 模拟器上启动和执行 Vending.apk

java - 方法参数在 Java 中是线程安全的吗?