在后台线程上加载广告 (adMob)

Posted

技术标签:

【中文标题】在后台线程上加载广告 (adMob)【英文标题】:Loading Ad (adMob) on Background Thread 【发布时间】:2013-06-22 20:07:18 【问题描述】:

我想在后台线程上加载我的添加,因为它使SlidingMenu 在打开和关闭时变得迟钝。我应该使用Thread/Handler 吗?还是AsyncTask

String MY_AD_UNIT_ID = "----";
AdView adView = new AdView(getActivity(), AdSize.BANNER, MY_AD_UNIT_ID);
final LinearLayout adLayout = (LinearLayout) getActivity()
            .findViewById(R.id.adLayout);
adLayout.addView(adView);
adView.loadAd(new AdRequest());

【问题讨论】:

我不相信这可以完成,因为所有与 UI 相关的东西都必须在主线程上完成 但不是有一部分是通过网络获取的吗? 是的,在 API 中可能在单独的线程中完成,因为如果在主线程上完成任何与网络相关的事情,android 将抛出 NetworkOnMainThreadException @tyczj 好的...听起来不错。你可以把答案当成... 【参考方案1】:

这可以通过runOnUiThread在 UI 线程上加载广告来实现

请通过onCreate()拨打此电话

    Thread adThread = new Thread()
    
        @Override
        public void run()
        
            loadAd();
        
    ;
    adThread.start();

loadAd()方法

private void loadAd()

    // Banner Ad
    final AdView adview = (AdView) this.findViewById(R.id.adview);

    // Request for ads
    final AdRequest adRequest = new AdRequest.Builder()
            // Time for test devices
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .addTestDevice("xxxxxxxxxxxxxxxxxxxxxxx")
            .addTestDevice("xxxxxxxxxxxxx")
            .build();

    // Load Ads on UI Thread
    runOnUiThread(new Runnable()
    
        @Override
        public void run()
        
            adview.loadAd(adRequest);
        
    );

【讨论】:

这可行,但我不确定它是否真的解决了相关问题。当它在 UI 上运行时,它仍然会导致其他 UI 元素滞后。 只是给任何在谷歌上搜索的人的注释:我在使用这个时开始收到错误Performing stop of activity that is not resumed: <your.package.name>/com.google.android.gms.ads.AdActivity ... 它无论如何都会在后台线程上运行,因为 AdMob 需要从 Google 的服务器更新广告。这只是一个小调整。【参考方案2】:

您应该在广告加载前使用MobileAds.initialize() 方法。之后 loadAd 工作得更快

Initializes the Google Mobile Ads SDK.

Call this method as early as possible after the app launches to reduce latency on the session's first ad request.

If this method is not called, the first ad request automatically initializes the Google Mobile Ads SDK.

【讨论】:

最好将链接中的相关信息也放入您的答案中,以便如果有一天链接断开,答案仍然有用。【参考方案3】:

我不相信这可以完成,因为所有与 UI 相关的东西都必须在主线程上完成。 API 可能已经有一个线程来获取网络上的广告。如果它没有在主线程上完成任何与网络相关的事情,android 会抛出 NetworkOnMainThreadException

【讨论】:

同意,我认为我们可以通过某种方式将网络操作和 UI 操作分开,但我错了。它们都在单个 api 调用中完成。

以上是关于在后台线程上加载广告 (adMob)的主要内容,如果未能解决你的问题,请参考以下文章

文件重新加载后台线程与基于请求

如何将 sizeForItemAt 放在后台线程上?

AdMob 无法在较小的屏幕尺寸上加载广告

如何在后台线程中从 NSFetchedResultsController 加载大数据

如何正确停止展示 AdMob 横幅广告?

Android:使用“进度”GUI在后台线程中从网络加载数据? [复制]