【问题标题】:Dagger 2 and Activity killedDagger 2 和 Activity 被杀死
【发布时间】:2018-04-09 08:51:27
【问题描述】:

我有一个使用 Dagger2 的应用 组件在Application的onCreate中实例化:

@Override
public void onCreate() {
    super.onCreate();
    mComponent =  DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();
}

Dagger 正在管理一个“CacheRepository”,它是一个存储用户在整个应用程序中使用的数据的类。

我遇到的问题是:当应用程序被系统杀死时,应用程序被破坏并且组件的实例丢失。但是当我再次启动该应用程序时,该应用程序会尝试恢复其先前的状态,其中包括从缓存中获取数据,该缓存现已重新初始化。因此应用程序崩溃,因为数据为空。

我怎样才能防止这种情况发生?

一个简单的选择是在被系统杀死时强制应用从头开始重新启动,但我还没有找到任何解决方案。

另一种解决方案是将缓存存储在 SharedPreferences(或任何类型的存储)中,但我不喜欢这种解决方案,因为缓存中的大部分数据都是临时的,它会使应用程序更加复杂。

【问题讨论】:

  • How can I prevent that? 您必须将有价值的信息保存在磁盘上(SharedPreferences,sqlite,作为纯文件)或将其保存在Bundle
  • 您可以使用 Realm、sqllite 等在本地 IE 中保存数据。另一种解决方案是为您的 dagger CacheRepository 研究自定义范围。
  • @willermo 是的,但这是我想避免的,因为我的组件中的数据应该只在应用程序处于活动状态时使用,而我在重新启动应用程序时不需要它们从一开始。

标签: android dagger-2 application-lifecycle


【解决方案1】:

感谢this answer from @David Wasser:,我想我已经找到了解决方案

这个想法是如果应用程序已被终止,则强制应用程序从头重新启动(例如闪屏)。

在所有活动的 onCreate() 中,检查是否使用公共静态变量或单例执行了“应用程序初始化”。如果初始化尚未完成,您知道您的应用程序的进程已被杀死并重新创建,您需要将用户重定向到您的根 Activity(即:重新启动应用程序)或立即在 onCreate() 中进行初始化活动。

这可能不是最好的解决方案,但至少它非常简单。而且您不会冒险破坏您的数据或存储您只想在应用程序生命周期内保留的内容。

【讨论】:

    【解决方案2】:

    您可以使用 Realm、sqllite 等将您的数据保存在本地 IE 中。另一个解决方案是为您的 dagger CacheRepository 寻找自定义范围。

    在 Dagger 2 的作用域机制中,只要它的作用域存在,它就关心保持类的单个实例。在实践中,这意味着@ApplicationScope 范围内的实例与 Application 对象一样长。只要 Activity 存在,@ActivityScope 就会保留引用(例如,我们可以在此 Activity 中托管的所有片段之间共享任何类的单个实例)。

    来源:Dependency injection with Dagger 2 - Custom scopes

    【讨论】:

    • 是的,这是我的问题。当应用程序被系统杀死时(在后台并且例如内存不足时),应用程序实例被破坏。结果,组件被释放。因此,当应用程序再次启动时,它会尝试恢复之前的状态。但是因为应用程序已被销毁,它和组件也被重新创建。所以前一个组件中的所有数据都丢失了,恢复的Activity得到了null数据,应用崩溃了。
    • 我猜你唯一的选择是在本地保存数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多