使用应用程序 class 作为配置更改的 hack-workaround 是否可以接受?

Is using the Application class as a hack-workaround for configuration changes acceptable?

我发现在一些棘手的情况下,扩展应用程序 class 并使用它来保存引用和值可能会有所帮助,否则很难通过配置更改在生命周期中进行协调。

这样做有什么真正的缺点吗?我不禁觉得这是 "too easy" 一个修复,这意味着可能有一些我没有考虑到的主要缺点。

我要把你的问题分解成两个子问题。

Is there any real downside to [storing information in a static scope]?

一些问题包括:

  • 内存泄漏

  • 线程安全,如果有多个线程可能会命中静态值

  • 内存泄漏

  • 处理 N 个可能的值,在您可能需要 N 个可能值的情况下(例如,某些 activity 的多个实例,每个实例都需要一个不同的值)

  • 内存泄漏

  • 与保留的片段和 onRetainNonConfigurationInstance() 一样,此解决方案对最近任务的进程终止和恢复没有帮助,而 onSaveInstanceState() Bundle 对此有帮助太

  • 我有提到内存泄漏吗?

有助于缓解其中一些问题的常见模式包括:

  • 将静态值视为大小有限的缓存(例如,LRUCache

  • 使用事件总线而不是您自己的静态值

Is there any real downside to [using Application as a static scope, as opposed to just an ordinary static field somewhere]?

只有一个 Application 实例。通常,与常规 static 字段相比,它的价值很小。而且,因为各种图书馆都希望您使用 他们的 "special snowflake" Application 基础 class,所以您尝试将自己的东西混入其中的次数越少,您将来 运行 发生碰撞的可能性较小。