【发布时间】:2018-08-09 08:22:30
【问题描述】:
对于我的 Android 项目,我需要全局单例缓存对象来通过应用程序访问有关用户的数据。
当应用程序进入后台并且在使用其他应用程序一段时间后我尝试打开缓存对象中的应用程序变量为空时,会出现问题。当我杀死应用程序并再次打开它时,一切都很好。 我正在使用依赖注入来访问 Cache 对象。 如果发生这种情况,为什么应用程序不会重新启动? 即使在内存不足的情况下,是否有一些注释可以保持缓存变量?
这是我的缓存类
class Cache {
var categories : Array<BaseResponse.Category>? = null
var user : BaseResponse.User? = null
var options : BaseResponse.OptionsMap? = null
var order: MenuOrderDataModel? = null
}
这是 DI 的存储模块
@Module class StorageModule {
@Singleton @Provides fun getSharedPrefs(context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
@Singleton @Provides fun getCache() : Cache = Cache()
}
我注入对象@Inject lateinit var cache: Cache,然后在初始屏幕中填充用户数据。
编辑 - 从应用程序和启动活动添加代码 sn-ps
class MyApp : Application() {
val component: ApplicationComponent by lazy {
DaggerApplicationComponent
.builder()
.appModule(AppModule(this))
.build()
}
companion object {
@JvmStatic lateinit var myapp: MyApp
}
override fun onCreate() {
super.onCreate()
myapp= this
Fabric.with(this, Crashlytics())
}
}
飞溅活动:
class SplashActivity : AppCompatActivity(), View.OnClickListener {
@Inject lateinit var viewModel : ISplashViewModel
private lateinit var disposable : Disposable
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
MyApp.myapp.component.inject(this)
}
【问题讨论】:
-
可能你从
Application.onCreate而不是MainActivity.onCreate运行依赖注入 -
是的。你能在 MainActivity 中解释一下为什么吗?因为在 SplashActivity 我需要注入 viewmodel。我已经编辑了答案,因此您可以查看我的 Application 类以及我如何使用 DI
-
您可能只在一个活动中设置
Cache中的变量,并且您的应用在进程死亡后从其他活动重新启动。 -
是的,你是对的,但我应该在每个活动中初始化用户数据以保持应用程序一致吗?有没有办法在匕首中注释缓存,以便缓存变量在清理内存后保持它们的状态?如果 dagger 可以自动序列化然后反序列化,或者类似的东西,那就太好了。
-
现在如果只有在
Cache中初始化某些变量的代码是问题的一部分... :)
标签: android caching dependency-injection kotlin dagger-2