当我在我的主活动中声明和初始化一个变量为静态变量,并且该活动被销毁后。我仍然可以访问该变量的内容吗?
例如,我想始终访问存储在此变量中的AsyncTask吗? 我希望能够在方向更改后也能访问它。
当我在我的主活动中声明和初始化一个变量为静态变量,并且该活动被销毁后。我仍然可以访问该变量的内容吗?
例如,我想始终访问存储在此变量中的AsyncTask吗? 我希望能够在方向更改后也能访问它。
静态变量与类相关联,只要类在内存中存在,它们就会一直存在,并在卸载类时销毁(这种情况非常少见)。
在Android中,当我们关闭任何应用程序时,它并不完全关闭,而是保留在最近使用的应用程序堆栈中。您可以通过长按主按钮(在大多数设备上)查看。
当其他应用程序需要内存时,Android本身会将这些最近使用的应用程序清除
如果进程被杀死,则所有的静态变量将会被重新初始化为默认值。
这主要是因为,当您重新启动应用程序时,会创建一个新的实例,而静态变量会被重新初始化。
setRetainInstance
或类似方法(请参见Android:如何防止在方向更改时清除类变量的答案)来保留实例状态。对于您的情况:
ViewModel架构组件在配置更改期间保持对象持久性。您可以使用它,但仍需要注意上下文泄漏。另一个选项是使用没有UI的片段。您在片段中调用函数setRetainInstance(true)
,系统将在配置更改时保留此片段。该片段保留您的数据,您可以在配置更改后通过片段管理器获取此片段。实际上,后一种选项是ViewModel的基础机制。对于像AsyncTask这样的多线程情况,运行在单独线程中的操作不应保留对上下文的引用。您应在单独的层中运行任务,然后更新ViewModel或保留片段中的必要字段。
我还能访问变量的内容吗?
假设你所说的"销毁"是指用户按下BACK键之类的操作,那么可以。
静态数据成员在整个进程的生命周期内都存在。
例如,我想始终访问存储在此变量中的AsyncTask?我希望在方向更改后也能访问它。
这不是一个合适的解决方案。使用保留的片段或 使用 onRetainNonConfigurationInstance()
。
setRetainInstance(true)
的片段,该片段管理AsyncTask
)。请参阅https://github.com/commonsguy/cw-omnibus/tree/master/Threads/AsyncTask。 - CommonsWareSherlockFragmentActivity
,并且它有一个刷新方法。在这个方法中,创建并执行了我的AsyncTask
的新对象。当任务开始时(onPreExecute()
),会创建一个Dialog
,并在doInBackground()
中三次更改对话框的消息,在onPostExecute()
中对话框被关闭。但是当方向改变时,就会出现一些问题。例如,没有对话框了。那么我该怎么办?我应该提出一个新问题,详细解释吗? - maysiDialogFragment
来管理你的对话框。据我所知,那个DialogFragment
可以被保留用于管理你的AsyncTask
,虽然我从不使用对话框。 - CommonsWare我相信我终于为你找到了一个参考资料 -
垃圾收集器会自动清理未使用的对象。如果程序不再持有某个对象的引用,则该对象将被视为未使用。您可以通过将持有该引用的变量设置为 null 来显式地丢弃引用。
https://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html
要明确的是,静态变量可能保持初始化状态,从而防止类被正确地垃圾回收(也称为内存泄漏)。静态变量的值将持续存在于类加载期间 - 它几乎与Activity生命周期(onCreate,...,onDestroy)无关。
当你第一次从代码中访问一个类时,它会被加载,然后直到有理由卸载它才会消失。
如果您的应用从内存中完全删除 - 通过任务杀手或当您的应用程序不再处于活动状态且内存不足时,Android将卸载该类。
因此,如果您创建了一个Android应用程序并初始化了一个静态变量,则它将在JVM中保留,直到发生以下情况之一: 1. 类已被卸载 2. JVM关闭 3. 进程死亡
是的,即使活动关闭,您在其中设置的值仍然保持持久化,但在应用程序关闭后不会。