gpt4 book ai didi

android - 应用恢复后单例对象变为空

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:41 25 4
gpt4 key购买 nike

对于我的 Android 项目,我需要全局单例缓存对象来通过应用程序访问有关用户的数据。

当一个应用程序进入后台并且在使用其他应用程序一段时间后我尝试打开缓存对象中的应用程序变量为空时出现问题。当我杀死应用程序并再次打开它时,一切都很好。我正在使用依赖注入(inject)来访问 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)对象 @Inject lateinit var cache: Cache,然后在启动画面中填充用户数据。

编辑 - 添加来自应用程序和启动 Activity 的代码 fragment

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())
}
}

飞溅 Activity :

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)
}

最佳答案

您遇到崩溃是因为您在一个 Activity 中初始化了这些变量,并期望它在另一个 Activity 中始终被设置。

但 Android 不是那样工作的,您很容易崩溃,因为在发生低内存情况后,首先只会重新创建当前 Activity,然后在返回导航时重新创建以前的 Activity,并且所有静态变量都被清空(因为该过程在技术上重新启动)。

尝试一下:

  • 使用 HOME 按钮将您的应用程序置于后台

  • 单击 Logcat 选项卡上的 TERMINATE 按钮

terminate button

  • 然后从启动器重新启动该应用。

您会遇到这种现象。

在 Android Studio 4.0 中,在您从 Android Studio 使用 Run 而不是从启动器启动应用程序后,Terminate 按钮有时会有点不同,并且可能会强制停止您的应用程序让它在您尝试时忘记您的任务状态。在这种情况下,只需再试一次,从启动器启动应用程序。它会在您第二次尝试时起作用。

您还可以根据 https://codelabs.developers.google.com/codelabs/android-lifecycles/#6 从终端触发“终止应用程序”行为,它看起来像这样:

$ adb shell am kill your.app.package.name

在新的 Logcat(Android Studio Electric Eel 及更高版本)中,“终止进程”按钮被删除,并移至设备监视器选项卡(“终止进程”)。

enter image description here


解决方案:检查空值并在基础 Activity (或 LiveData.onActive)中重新初始化事物,或使用 onSaveInstanceState

关于android - 应用恢复后单例对象变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49046773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com