匕首2和活动被杀

时间:2017-10-27 17:11:17

标签: android dagger-2 application-lifecycle

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

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

Dagger正在管理一个" CacheRepository"这是一个存储用户在应用程序中使用的数据的类。

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

我该如何防止这种情况?

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

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

2 个答案:

答案 0 :(得分:1)

我想我已经通过this answer from @David Wasser:

找到了解决方案

如果应用程序已被杀死,我们的想法是强制应用程序从头重启(例如一个启动画面)。

  

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

它可能不是最好的解决方案,但至少它非常简单。并且您没有风险来破坏您的数据或存储您希望仅在应用程序生命周期内保存的内容。

答案 1 :(得分:0)

您可以使用Realm,sqllite等在本地IE中保存您的数据。另一种解决方案是查看您的dagger CacheRepository的自定义范围。

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

来源:Dependency injection with Dagger 2 - Custom scopes