Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序崩溃时的android静态变量行为_Android_Crash_Static Variables - Fatal编程技术网

应用程序崩溃时的android静态变量行为

应用程序崩溃时的android静态变量行为,android,crash,static-variables,Android,Crash,Static Variables,在我的应用程序中,我具有Loginactivity。它有一个静态变量username,它将被分配给username的用户输入值。Loginactivity启动活动A和A启动B。在A中,我使用变量Loginactivity.username 现在由于B中的一些错误,应用程序崩溃。当我按force close时,应用程序将重新启动,活动A是当前活动。在活动A中,我使用一个静态变量Loginactivity.username。我看到崩溃后这个变量得到了它的初始值,它是空字符串“” 为什么会这样?你能解

在我的应用程序中,我具有Loginactivity。它有一个静态变量username,它将被分配给username的用户输入值。Loginactivity启动活动A和A启动B。在A中,我使用变量Loginactivity.username

现在由于B中的一些错误,应用程序崩溃。当我按force close时,应用程序将重新启动,活动A是当前活动。在活动A中,我使用一个静态变量Loginactivity.username。我看到崩溃后这个变量得到了它的初始值,它是空字符串“”


为什么会这样?你能解释一下这种行为吗?那么,当应用程序崩溃时,堆栈中的所有活动都会重新启动吗?我看到oncreate的Loginactivity没有被调用。那么静态变量值是如何更改的?

是的,当应用程序崩溃时,此应用程序的jvm会重新启动,类会重新加载,并且会丢失所有静态变量和实例变量


解决方案是消除碰撞原因。:)

这是因为您在LoginActivity中保留的静态成员导致内存泄漏

我会考虑将这个变量保存在应用程序范围(自定义应用程序类)中,或者将其保存到DB。< /P>


无论如何,只要记住在应用程序完成时将此变量置零。

使用SharedReferences,或者在活动B崩溃时将信息存储在应用程序类中,应用程序运行的Android Dalvik虚拟机(每个应用程序都有自己的DVM,它们是独立的进程)被杀死。启动活动A时,用户名为“”,因为Java默认情况下会将所有实例变量(类变量或字段,如果愿意)设置为null(引用),0(原语)和“”作为字符串。因此,您的活动A工作正常。您只需要将用户名存储在共享首选项、数据库中,或者触发事件,以便用户再次登录。。。我还将修复活动B。。。哈哈

我修复了碰撞,但想知道其行为。谢谢。这是一个很好的问题,在android文档中没有提到。如果答案合适,请接受。如果应用程序重新启动,它是如何获得上一个活动堆栈的。每当在Loginactivity中重新启动我的应用程序时,我都会从SharedRef读取用户名。在这里,我看到Loginactivity并没有重新启动,而是启动了位于堆栈顶部的Instad activity A。在A中,我将变量设置为Loginactivity.username,虽然活动未重新启动,但该变量已重置!–因此,阅读共享偏好并不是在正确的地方发生的。你应该考虑在每一个需要价值的活动中阅读。但您是否纠正了崩溃原因?我在这里有一个疑问:如果应用程序重新启动,它将如何获得上一个活动堆栈。每当在Loginactivity中重新启动我的应用程序时,我都会从SharedRef读取用户名。我看到Loginactivity没有重新启动,启动了位于堆栈顶部的Instad activity A。在A中,我将变量设置为Loginactivity.username,虽然活动未重新启动,但该变量已重置!也许您的共享pref无法正常工作。您的堆栈已被VM杀死。或者您绕过登录活动的逻辑出现故障。来源?