Ошибка при инициализации Interstitial ads
У меня есть синглтон класс для загрузки и показа рекламы
object AdmobProvider {
var countLoadAds = 0
lateinit var mInterstitialAd: InterstitialAd
private val adRequest = AdRequest.Builder().build()
fun init(activity: Activity) {
MobileAds.initialize(activity)
initInterstitial(activity)
}
private fun initInterstitial(context: Activity) {
mInterstitialAd = InterstitialAd(context)
if (!SubscriptionProvider.hasSubscription()) {
mInterstitialAd.adUnitId = context.getString(R.string.interstitial_video)
mInterstitialAd.loadAd(adRequest)
mInterstitialAd.adListener = object : AdListener() {
override fun onAdClosed() {
super.onAdClosed()
Log.i("AdmobProvider", "onAdClosed: ")
}
override fun onAdFailedToLoad(p0: Int) {
super.onAdFailedToLoad(p0)
countLoadAds++
Log.i("AdmobProvider", "onAdFailedToLoad: $countLoadAds")
if (countLoadAds <= 3) {
initInterstitial(context)
} else {
callback?.Failed(true)
}
}
override fun onAdOpened() {
super.onAdOpened()
Log.i("AdmobProvider", "onAdOpened: ")
}
override fun onAdLoaded() {
super.onAdLoaded()
Log.i("AdmobProvider", "onAdLoaded: ")
if (mInterstitialAd.isLoaded) {
callback?.Success(true)
}
}
}
}
}
fun showInterstitial() {
if (mInterstitialAd.isLoaded) {
mInterstitialAd.show()
}
}
}
Я загружаю рекламу в
ActivityA
AdmobProvider.init(this)
AdmobProvider.addAdmobProviderCallback(this)
override fun Success(state: Boolean) {
Handler().postDelayed({
val intent = Intent(this@ActivityA, ActivityB::class.java)
intent.putExtra("ActivityA", 1)
startActivity(intent)
finish()
}, 200)
}
И показываю в
ActivityB
if (intent.getIntExtra("ActivityA", 0) == 1) {
AdmobProvider.showInterstitial()
}
Пока тестировал на телефоне и эмуляторах все нормально было, а в метрику от пользователей стал прилетать краш во втором активити, в основном на Android 8+ есть и версиях ниже, но гораздо реже.
java.lang.RuntimeException: Unable to start activity ComponentInfo{MainActivity}: d.m: lateinit property mInterstitialAd has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3455)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3598)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2164)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:7582)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Caused by: d.m: lateinit property mInterstitialAd has not been initialized
at .b.i(Unknown Source)
at .MainActivity.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:7822)
at android.app.Activity.performCreate(Activity.java:7811)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1328)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3430)
Я понимаю в чем ошибка, но не могу понять как правильно пофиксить, ведь если я инициализирую рекламу во втором активити, мне ее и грузить там же надо будет, а мне это не подходит. Если верить метрике то в 88% случаев краш происходит в background. Подскажите пожалуйста, как правильно исправить!?