【问题标题】:Lazy AdMob ads loading延迟加载 AdMob 广告
【发布时间】:2018-11-03 11:50:02
【问题描述】:

我正在我的主要活动中加载一个简单的横幅广告。问题是每当我启动应用程序时,它会在白屏上停留大约 2 秒,然后加载 UI。 问题不在于应用程序代码,因为在我添加用于立即启动的广告应用程序之前。这是我加载广告的代码:
onCreate

MobileAds.initialize(this, "ca-app-pub-#######")
        val mAdView: AdView = findViewById(R.id.adView)
        mAdView.visibility = View.GONE
        val adRequest = AdRequest.Builder().build()
        val adView = AdView(this)
        adView.adSize = AdSize.BANNER
        adView.adUnitId = "ca-app-pub-3940256099942544/6300978111"  <- test id
        initializeAds(mAdView, adRequest)

initializeAds():

 fun initializeAds(adView: AdView, adRequest: AdRequest){
        adView.loadAd(adRequest)
        adView.adListener = object : AdListener(){
            override fun onAdLoaded() {
                super.onAdLoaded()
                if (adView.visibility == View.GONE) {
                    adView.visibility = View.VISIBLE
                }
            }

            override fun onAdFailedToLoad(p0: Int) {
                super.onAdFailedToLoad(p0)
                adView.visibility = View.GONE
            }
        }
    }

有没有什么方法可以在没有 UI 延迟的情况下加载广告?

【问题讨论】:

  • 您确定要为 Android baners 使用测试广告单元 ID 吗?
  • 我已经使用 AdMob 生成的单元 ID 将应用推送到 Play 商店
  • 但要进行测试,您应该使用测试广告单元 ID。
  • 几小时前我更新了代码,反正运行速度很慢。

标签: android kotlin admob


【解决方案1】:

将此用作横幅广告 ID ca-app-pub-3940256099942544/6300978111

【讨论】:

  • 上下文:docs 提到使用该 ID 进行测试广告。
  • 即使使用测试 ID 我的应用加载缓慢。
【解决方案2】:

好的,伙计们,我终于找到了一个快速的解决方法。我发现MobileAds.initialize(context, id)AdRequest.Builder().build() 造成了延迟。显然,除非onCreate 完全执行,否则活动不会完全加载。为了绕过我使用Handler 延迟MobileAds.initializeAdRequest.Builder().build 然后它不会使UI 滞后。这是我更新的代码:

       // we can't delay UI tasks so we need initialize adView here - it's not heavy task anyway
        val mAdView: AdView = findViewById(R.id.adView)
        mAdView.visibility = View.GONE

        //delay ads to be displayed 2 sec after Activity is loaded
        Handler().postDelayed({
            MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713")
            initializeAds(mAdView)
        }, 2000)

initializeAds(AdView):

   fun initializeAds(adView: AdView) {
        adView.loadAd(AdRequest.Builder().build())
        adView.adListener = object : AdListener() {
            override fun onAdLoaded() {
                super.onAdLoaded()
                //if ad is loaded just show it
                if (adView.visibility == View.GONE) {
                    adView.visibility = View.VISIBLE
                }
            }

            override fun onAdFailedToLoad(p0: Int) {
                //if we can't show ad just hide it
                super.onAdFailedToLoad(p0)
                adView.visibility = View.GONE
            }
        }
    }

如果有人遇到类似问题,我希望它会有所帮助

【讨论】:

    【解决方案3】:

    Domin 建议您为 MobileAds.Initialize() 执行大约 2000 毫秒的后期延迟。请不要那样做。 2 秒后,用户界面冻结!用户会非常恼火。如果启动慢于应用程序在用户开始使用时无响应则更好。

    【讨论】:

      【解决方案4】:
      //Kotlin Code
      //Heavy tasks in Second Thread
      //finally loadAd() in UI thread
      Thread{
      MobileAds.initialize(this);
      val mAdView = findViewById<AdView>(R.id.adview);
      val adRequest = AdRequest.Builder().build();
      runOnUiThread {
          mAdView.loadAd(adRequest);     
      }}.start();
      

      【讨论】:

      • 一般来说,在 android 中使用像这样的原始线程是个坏主意 - 活动可能会在后台线程完成之前被破坏。
      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多