【问题标题】:ClassCastException: Application object is not my custom application objectClassCastException:应用程序对象不是我的自定义应用程序对象
【发布时间】:2017-12-19 08:50:43
【问题描述】:

在 Android 代码中,我们经常使用这种模式,将数据存储在 Application 对象中,然后通过强制转换访问它:

((MyApplicationObject)getApplication()).getDaggerComponent()

getApplication() 应始终为MyApplicationObject,因为我已在AndroidManifest.xml 中指定它。但是,当您部署此代码时,有时它会导致 ClassCastException,而我们会得到一个不同的对象。

这怎么可能?

解决此问题的正确方法是什么?

【问题讨论】:

  • 导致类转换异常?错误信息是什么。它应该说类似“XX 不能转换为 MyApplicationObject”。你的XX是什么?
  • 我不知道 XX 是什么,因为我只能在 Google Play Console 中找到这个错误,它没有提供该信息
  • 嗯,这很奇怪,它不应该是与您定义的应用程序不同的应用程序。无论如何,解决方法是在投射前检查instanceof
  • 您是否在特定版本的 Android SDK(例如 API 24-25)中看到了这一点? There's a known issue about trying to cast the Application.
  • 感谢您提供该链接! 98% 的崩溃来自 Android 7.0,0.2% 来自 Android 7.1。在链接中,@google 工程师说他们改进了 7.0 中的主要问题,但没有完全修复。

标签: android dagger-2 dagger


【解决方案1】:

已在 cmets 中解决:这是一个 Android 错误,与 Dagger 无关。

感谢您提供该链接! 98% 的崩溃来自 Android 7.0,0.2% 来自 Android 7.1。@google 工程师在链接中表示,他们改进了 7.0 中的主要问题,但并未完全修复。 – gregm

查看这个公开的 Google IssueTracker 链接,#37137009: java.lang.ClassCastException: Cannot cast android.app.Application to com.xxx.xxApplication(ctate 在#17 中的评论):

是的,这是一个已知问题;并在 7.1 中主要解决。 7.1 中仍然存在一些可能导致类似情况的边缘案例 - 正如您从分析中看到的那样 - 但机会之窗要窄得多,Android 8 也解决了这些问题。

不幸的是,目前似乎没有太多解释或官方解决方法,但至少该问题主要局限于 Android 7.0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多