我有一个使用Dagger2的应用程序,该组件在应用程序的onCreate中实例化:
@Override
public void onCreate() {
super.onCreate();
mComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}Dagger正在管理一个"CacheRepository“,它是一个存储用户在整个应用程序中使用的数据的类。
我遇到的问题是:当应用程序被系统杀死时,应用程序就会被销毁,组件的实例也会丢失。但是当我再次启动应用程序时,应用程序尝试恢复以前的状态,其中包括从缓存中获取数据,缓存现在已经被重新初始化了。因此,当数据为空时,应用程序就会崩溃。
我怎么才能防止这种情况?
一个简单的选择是迫使应用程序从零开始重新启动时,被系统杀死,但我还没有找到任何解决方案这样做。
另一种解决方案是将缓存存储在SharedPreferences (或任何类型的存储)中,但我不喜欢这种解决方案,因为缓存中的大多数数据都是临时的,这使得应用程序更加复杂。
发布于 2017-10-30 17:34:18
我想我找到了解决方案多亏了以下是大卫·瓦赛尔的回答:
这样做的目的是迫使应用程序从一开始就重新启动(例如,一个启动屏幕),如果应用程序被杀死了。
在所有活动的onCreate()中,检查"app初始化“是否使用了公共静态变量或单例。如果初始化尚未完成,您知道应用程序的进程已被终止并重新创建,您需要将用户重定向到您的根活动(即:重新启动应用程序),或者在活动的onCreate()中立即进行初始化。
这也许不是最好的解决方案,但至少它非常简单。而且,您不会冒险损坏您的数据或存储仅在应用程序生命周期内要保存的内容。
发布于 2017-10-27 18:02:48
您可以在本地使用领域、sqllite等保存数据。另一个解决方案是为您的匕首CacheRepository寻找自定义Scopes。
在Dagger 2作用域中,只要类的作用域存在,机制就关心保持类的单个实例。在实践中,这意味着@ApplicationScope中作用域的实例与Application对象一样存在。@ActivityScope只要活动存在就保留引用(例如,我们可以在此活动中托管的所有片段之间共享任何类的单个实例)。
来源:Dagger 2-自定义作用域的依赖注入
https://stackoverflow.com/questions/46980290
复制相似问题