我的应用程序包含两个活动:SignInActivity和MainActivity。 SignInActivity允许用户登录,并初始化应用程序正常运行所需的一堆重要变量。 MainActivity包含一堆组成实际应用程序的片段。这些片段使用带有ViewModel
的MVVM体系结构。 Fragment
类从其ViewModel加载信息以显示在屏幕上。
一个Fragment
AppleFragment通过调用vm.getAppleType().getName()
来加载苹果类型(用户先前输入的)。然后,AppleFragment在屏幕上显示苹果的类型。用户只有在设置了苹果类型之后才能导航到AppleFragment。
假设用户在MainActivity和AppleFragment中使用我的应用程序时按下了主页按钮。该应用程序将移至后台,并且可能会被Android操作系统杀死以节省内存。如果是这种情况,然后用户转到“概述”屏幕(即方形按钮)并选择要打开的应用程序,Android将重新启动上次打开的活动(MainActivity),以及上一次打开的片段(AppleFragment),但所有变量(包括ViewModels中的变量)都是新鲜的-即从头开始。
由于AppleFragment在onViewCreated()中加载了vm.getAppleType().getName()
,并且ViewModel完全空白-请记住,Android销毁了所有内容以节省内存-vm.getAppleType().getName()
导致NPE且应用程序崩溃。
为减轻这种情况,我让MainActivity检查重要的应用程序变量是否已初始化,如果没有初始化,请启动SignInActivity。想法是,在上述情况下,用户将被重定向到SignInActivity,并且应用程序将在用户登录时填充重要变量。用户无法导航至AppleFragment,除非他们设置了Apple类型,然后,ViewModel可以将其分配给AppleFragment进行显示。
这种方法不能完全起作用,因为startActivity()调度SignInActivity,但是不会立即启动它-尤其是要等到MainActivity的所有生命周期方法都已运行完之后,才能立即启动。看来,作为MainActivity的onStart()方法的一部分,最近查看的片段AppleFragment已加载。这是我们遇到麻烦的地方,因为AppleFragment在其onViewCreated方法中调用vm.getAppleType().getName()
导致NPE和应用程序崩溃。
答案 0 :(得分:1)
来自the docs:
如果不需要存储大量数据并且不需要结构,则应使用SharedPreferences。使用SharedPreferences API,您可以读写原始数据类型的持久键值对:布尔值,浮点数,整数,长型和字符串。
我认为这应该可以解决您的问题。
当变量丢失时,我认为不能将用户重定向到再次登录。我建议将这些值保存在SharedPrefences中。如果您担心安全性,可以阅读:Android SharedPreference security