android - 什么会导致 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% 的设备上出现
解决方案
您的loadAds()
呼叫似乎是由于异步操作(onConsentInfoUpdated()
由 触发AsyncTask
)而发生的。您不知道异步操作需要多长时间,也不知道您的活动/片段当时可能处于什么状态。例如,也许用户在被调用MainActivity
之前按下了 BACK 并销毁。loadAds()
您需要处理activity
isnull
或 Activity 本身已被破坏(isFinishing
或isDestroyed
are true
)的情况。
推荐阅读
- html - 将悬停覆盖在具有多个 div 的容器上?(弹性盒)
- tomcat - 尝试使用智能卡对 Tomcat 进行身份验证
- installation - 如何使用 charStrip nsis
- javascript - 引导切换 - 如何始终具有打开而不是禁用的值
- java - 仅安装了 JDK 11 的 Gradle 构建上的 UnsupportedClassVersionError?
- ruby-on-rails - 如何使用 API 中的 wicked_pdf 生成 PDF
- javascript - 初始化时的 Firebase 消息传递 ServieWorkerGlobalScope 错误
- php - WordPress 注册 JSON 端点 - 哪个 PHP 文件?
- excel - 将列转置到值相似的行
- python - 破折号动态滑块