android - El objeto Singleton se vuelve nulo después de que se reanuda la aplicación
caching dependency-injection (1)
Se producen bloqueos porque inicializa esas variables en una Actividad y espera que se establezca siempre en la otra Actividad.
Pero Android no funciona así, puede terminar fallando fácilmente porque después de que ocurre una condición de poca memoria, solo se recrea la Actividad actual al principio, se recrea la Actividad anterior en la navegación hacia atrás y se anulan todas las variables estáticas (porque el proceso se reinicia técnicamente).
Pruébelo: coloque su aplicación en segundo plano con el botón INICIO, haga clic en el botón TERMINAR en Android Studio, luego vuelva a iniciar la aplicación desde el iniciador. Experimentarás este fenómeno.
Solución: compruebe si hay valores nulos y reinicie las cosas en una actividad base (o en LiveData.onActive).
Para mi proyecto de Android, necesito un objeto de caché singleton global para acceder a los datos sobre un usuario a través de la aplicación.
Se produce un problema cuando una aplicación pasa a segundo plano y después de un tiempo de usar otras aplicaciones, trato de abrir las variables de la aplicación en los objetos de caché son nulas. Todo está bien cuando elimino la aplicación y la abro nuevamente. Estoy usando la inyección de dependencia para acceder al objeto Cache. ¿Por qué la aplicación no comienza de nuevo si eso sucedió? ¿Hay alguna anotación para mantener la variable de caché incluso en condiciones de poca memoria?
Esta es mi clase de caché
class Cache {
var categories : Array<BaseResponse.Category>? = null
var user : BaseResponse.User? = null
var options : BaseResponse.OptionsMap? = null
var order: MenuOrderDataModel? = null
}
Este es el módulo de almacenamiento para 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
objeto
@Inject lateinit var cache: Cache
y luego lo
@Inject lateinit var cache: Cache
con los datos del usuario en la pantalla de
@Inject lateinit var cache: Cache
.
Editar: fragmentos de código agregados de la aplicación y la actividad de inicio
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())
}
}
Actividad de bienvenida:
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)
}