Android静态变量范围和生命周期

时间:2011-03-14 23:49:03

标签: android memory-management scope instance-variables power-management

我有一个应用程序,其服务使用ArrayList<Double>在后​​台存储数字很长一段时间;服务启动时初始化变量。

服务在后台,并且会经常访问变量(这就是我不想使用文件管理或设置的原因 - 对于文件I / O而言,这将是非常昂贵的电池寿命)。

该变量在其生命周期内可能约为1MB-> 2MB。

是否可以安全地说GC或系统永远不会将变量置为空白,或者有什么方法可以阻止它?

2 个答案:

答案 0 :(得分:5)

  

我有一个应用程序,它有一个Service,它使用ArrayList在后台存储数字很长时间

如果“很长一段时间”大于“几秒钟,或者只要用户明确要求它运行”,那么我们就会遇到问题。

简单地说,您的服务将不会“长时间”生活。用户将使用任务杀手将其终止,或者用户将使用“设置”应用程序将其终止,否则Android会因年龄过大而将其终止。太多开发人员泄漏服务,导致设备性能下降。

除了短暂的时间段(例如,在下载大文件时)或在用户请求(例如,音乐播放器)时,真正需要运行的服务很少。

  

是否可以安全地说GC或系统永远不会将变量置为空白,或者有什么方法可以阻止它?

只要流程存在,它就会存在。该过程将一直存在,直到您停止服务(假设没有其他组件正在运行),或者直到用户重新启动他们的电话,或者直到之前概述的任何情况(例如,任务杀手)发生。

答案 1 :(得分:1)

  

可以肯定地说,GC或系统永远不会将变量置为空白

是的,只要您的代码中可以访问该变量,但这可能是件好事还是坏事。

静态变量的“生命周期”是该类的“生命周期” - 加载该类时的“永远和永远” - 并且范围是可以访问所述稳定标识符的任何代码,例如,虽然也可以考虑反射,但是通过可见性修饰符允许的那样。

但是,变量不是GC - 对象是,所以显式/手动将变量设置为“null”或“虚拟对象”正在使用的可能 - 如果没有其他对该变量引用的对象的引用 - 使所述对象有资格进行回收。

但是,最好尽量避免使用静态值,因为这也可以帮助隐式对象生存期控制。

快乐的编码。