Java Android中静态变量的生存期

Java Android中静态变量的生存期,java,android,static,Java,Android,Static,当我在主活动中将变量声明为静态并初始化时,该活动将被销毁。我仍然可以访问变量的内容吗 例如,始终访问我存储到此变量的AsyncTask? 我想要的是在方向更改后也能够访问它。如果进程被终止,那么所有静态变量都将重新初始化为默认值 这主要是因为,当您重新启动应用程序时,将创建一个新实例,并且静态变量将重新初始化 我仍然可以访问变量的内容吗 假设“销毁”的意思是用户后退,是的 静态数据成员在进程的生命周期中一直存在 例如,始终访问我存储到此变量的AsyncTask?我想要的是在方向改变后也能访问它

当我在主活动中将变量声明为静态并初始化时,该活动将被销毁。我仍然可以访问变量的内容吗

例如,始终访问我存储到此变量的AsyncTask?
我想要的是在方向更改后也能够访问它。

如果进程被终止,那么所有静态变量都将重新初始化为默认值

这主要是因为,当您重新启动应用程序时,将创建一个新实例,并且静态变量将重新初始化

我仍然可以访问变量的内容吗

假设“销毁”的意思是用户后退,是的

静态数据成员在进程的生命周期中一直存在

例如,始终访问我存储到此变量的AsyncTask?我想要的是在方向改变后也能访问它


这不是一个适当的解决办法。使用保留的片段,或者。

静态变量与类相关联,它们将在类在内存中的时间内一直存在,并在类卸载时销毁(这种情况很少发生)

在安卓系统中,您已经看到,当我们关闭任何应用程序时,它不会完全关闭,它会保留在最近的应用程序堆栈中,您可以通过按住home按钮(在大多数设备上)来查看

当另一个应用需要时,安卓自己就把这些最新的应用踢了出去 记忆

Android的概念是,你的应用程序可能不会 如果用户经常使用,即使 其所有组件均已销毁(活动、服务和/或 广播接收器),在这种情况下,静态变量 完全清除

应用程序类是共享一些临时变量的最佳方式 组件之间,因为将正确创建应用程序类 在应用程序启动时,将在用户退出后清除 应用程序


参考:

静态变量或静态块与对象不关联。这些是与对象无关的类级别变量。若我们销毁对象,静态变量将不会销毁在同一类中定义的对象。静态变量在内存中初始化一次


因此,当我们关闭应用程序时,对象会销毁,但静态变量不会销毁。但当我们清除应用程序时,类破坏等静态变量也随之消失。有时android会因为释放内存空间而杀死类,在这种情况下静态变量会被销毁

即使你用“后退”按钮关闭应用程序,只要你没有从最近的应用程序中清除它们,它们也会保留。证据:我已经测试过了,你也可以,很简单;)

一旦我开发了使用大量静态变量的应用程序,静态变量的问题在于,一旦android内存不足,它会自动删除静态变量,如果您的视图与静态变量连接,它将不会显示,或者更糟的是,应用程序将崩溃。我建议使用共享首选项或其他方法来存储变量

问题

  • 如果您的android内存不足,静态变量将从ram中删除,您必须重新初始化它们

  • 如果您的视图附加到静态变量(如ArrayList to recycler view),它将抛出错误(如空指针异常),因为每次初始化视图时都必须检查平衡

  • 主要的问题是,您的变量太大,就像ArrayList中有图像一样,有时会出现内存不足异常


  • 我想我终于找到了你的推荐人-

    垃圾收集器会自动清理未使用的对象。如果程序不再持有对某个对象的引用,则该对象未被使用。通过将保存引用的变量设置为null,可以显式删除引用


    需要说明的是,静态变量可以保持初始化状态,从而防止类被正确地垃圾收集(也称为内存泄漏)。

    静态变量与类的生命周期相关联。一旦一个活动被破坏,静态变量也将被清除

    如果仍要访问该变量,则有2个选项:-

  • 重写onSaveInstanceState并保存所需变量,然后将其还原到onRestoreInstanceState中
  • 将变量存储在应用程序类中,并在任何地方访问它 随时都可以

  • 只要类被加载,静态变量的值就会一直存在——它几乎与活动生命周期无关(onCreate,…,onDestroy)

    第一次从代码访问类时,它将被加载,然后直到有理由卸载它时才会消失

    如果你的应用程序被完全从内存中删除,Android将卸载一个类——要么是通过任务杀手,要么是当你的应用程序不再处于活动状态且内存不足时

    因此,如果创建android应用程序并初始化静态变量,它将保留在JVM中,直到发生以下情况之一: 1.该类已卸载 2.JVM关闭
    3.进程死了

    一旦将封闭类加载到内存中,就会创建静态变量。您可以在静态块中的加载时初始化静态变量,或者在代码已经运行时初始化静态变量,就像您的情况一样。静态变量与类型相关,而不是与类型的单个实例相关,因为一旦创建了静态变量,它就与包含它的进程一样长(在android中,它意味着它与应用程序一起存在)。它可能导致的问题有:

    • 上下文泄漏(如活动):静态变量保持对上下文或对象(如视图)的引用,对象保持对它的引用
    • 内存上的巨大负担:如果在生命周期短于应用程序的类型中使用静态变量,则该过程会使所有静态变量保持活动状态。例如,在十个活动中,您将位图保持为静态