首页 > 解决方案 > 什么会导致 Activity 出现 kotlin.TypeCastException?

问题描述

在 Google Play 控制台中,我查看错误报告并看到以下内容:

kotlin.TypeCastException: 
  at com.app.android.ui.SplashFragment.loadAds (SplashFragment.java:111)
  at com.app.android.ui.SplashFragment$requestConsentInfoUpdate$1.onConsentInfoUpdated (SplashFragment.java:68)
  at com.google.ads.consent.ConsentInformation$ConsentInfoUpdateTask.onPostExecute (ConsentInformation.java:277)
  at com.google.ads.consent.ConsentInformation$ConsentInfoUpdateTask.onPostExecute (ConsentInformation.java:188)
  at android.os.AsyncTask.finish (AsyncTask.java:632)
  at android.os.AsyncTask.access$600 (AsyncTask.java:177)
  at android.os.AsyncTask$InternalHandler.handleMessage (AsyncTask.java:645)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:145)
  at android.app.ActivityThread.main (ActivityThread.java:5942)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1400)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1195)

谷歌还提供了额外的。错误信息: введите сюда описание изображения

我尝试在不同版本的 Android 上运行该应用程序,但没有收到错误消息

该应用程序由一个活动(MainActivity)和几个片段组成。

SplashFragment 中出现错误的方法:

fun loadAds() {
        (activity as MainActivity).forceShowAd(callback = { // <- вот тут возникает исключение
            Log.i(TAG, "load ads");
            (activity as MainActivity).toMain()
        })
    }

MainActivity中被调用的方法:

fun forceShowAd(callback: () -> Unit) {
        Log.i(TAG, "forceShowAd")
        run {
            val mInterstitialAd = InterstitialAd(this)
            mInterstitialAd.apply {
                adUnitId = getString(R.string.admob_inter)
                adListener = object : AdListener() {
                    override fun onAdLoaded() {
                        callback()
                        show()
                    }

                    override fun onAdFailedToLoad(p0: Int) {
                        super.onAdFailedToLoad(p0)
                        var mStartAppAd = StartAppAd(applicationContext)
                        mStartAppAd.loadAd(object : AdEventListener {
                            override fun onReceiveAd(ad: Ad) {
                                mStartAppAd.showAd()
                                callback()
                            }
                            override fun onFailedToReceiveAd(ad: Ad) {
                                callback()
                            }
                        })
                    }
                }
                loadAd(getAdRequest())
            }
        }

    }

这是 SplashFragment 在 MainActivity 中的启动方式:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, SplashFragment.newInstance())
                    .commit()
        }
    }

根据应用程序的生命周期,当 Fragment 运行时,Activity 也应该工作。但同时,据我了解,在引发异常时activity == null

什么可能导致异常问题?此问题已在 6% 的设备上出现

标签: androidandroid-fragmentskotlin

解决方案


您的loadAds()呼叫似乎是由于异步操作(onConsentInfoUpdated()由 触发AsyncTask)而发生的。您不知道异步操作需要多长时间,也不知道您的活动/片段当时可能处于什么状态。例如,也许用户在被调用MainActivity之前按下了 BACK 并销毁。loadAds()

您需要处理activityisnull或 Activity 本身已被破坏(isFinishingisDestroyedare true)的情况。


推荐阅读