Ленивая загрузка объявлений AdMob

Я загружаю простой рекламный баннер в своей основной деятельности. Проблема в том, что всякий раз, когда я запускаю приложение, оно застревает около 2 секунд на белом экране, а затем загружает пользовательский интерфейс. Проблема не в коде приложения, потому что до того, как я добавил рекламу, приложение запускалось мгновенно. Это код, по которому я загружаю рекламу:
в 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
            }
        }
    }

Есть ли способ загрузить рекламу без задержки пользовательского интерфейса?

Вы уверены, что используете ID тестового рекламного блока для банеров Android?

Joe 03.11.2018 13:11

Я уже использовал идентификатор объекта, сгенерированный из AdMob, чтобы отправить приложение в Play Store.

Domin 03.11.2018 13:17

Но для тестирования следует использовать ID тестового рекламного блока.

Joe 03.11.2018 16:09

Я обновил код несколько часов назад, он все равно работает медленно.

Domin 03.11.2018 17:20
3
4
1 242
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Использовать это как идентификатор рекламного баннера ca-app-pub-3940256099942544/6300978111

Контекст: в документы упоминается использование этого идентификатора для тестовых объявлений.

Zoe 03.11.2018 13:29

даже при использовании тестового идентификатора мое приложение загружается медленно.

Domin 03.11.2018 13:30
Ответ принят как подходящий

Хорошо, ребята, наконец-то я нашел быстрое решение. Я обнаружил, что MobileAds.initialize(context, id) и AdRequest.Builder().build() делают лаги. Очевидно, что активность не будет полностью загружена, если onCreate не будет полностью выполнен. Чтобы обойти это, я использовал Handler для задержки MobileAds.initialize и AdRequest.Builder().build, и тогда это не вызывает задержек пользовательского интерфейса. Это мой обновленный код:

       // 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
            }
        }
    }

Надеюсь, это поможет, если кто-то борется с подобной проблемой.

Домин предлагает сделать задержку публикации около 2000 мс для MobileAds.Initialize (). Пожалуйста, не делай этого. Через 2 секунды интерфейс просто зависает! Пользователь будет очень раздражен. Лучше, если бы запуск был медленнее, чем приложение не реагировало, когда пользователь начал его использовать.

//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 - активность может быть уничтожена до того, как будет завершен фоновый поток.

3mpty 19.11.2020 11:52

Другие вопросы по теме