Я загружаю простой рекламный баннер в своей основной деятельности. Проблема в том, что всякий раз, когда я запускаю приложение, оно застревает около 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
}
}
}
Есть ли способ загрузить рекламу без задержки пользовательского интерфейса?
Я уже использовал идентификатор объекта, сгенерированный из AdMob, чтобы отправить приложение в Play Store.
Но для тестирования следует использовать ID тестового рекламного блока.
Я обновил код несколько часов назад, он все равно работает медленно.
Использовать это как идентификатор рекламного баннера ca-app-pub-3940256099942544/6300978111
Контекст: в документы упоминается использование этого идентификатора для тестовых объявлений.
даже при использовании тестового идентификатора мое приложение загружается медленно.
Хорошо, ребята, наконец-то я нашел быстрое решение. Я обнаружил, что 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 - активность может быть уничтожена до того, как будет завершен фоновый поток.
Вы уверены, что используете ID тестового рекламного блока для банеров Android?