【问题标题】:Is null possible for static final variable when Android is low on memory?当Android内存不足时,静态最终变量是否可能为null?
【发布时间】:2020-01-08 10:28:54
【问题描述】:

我读到,当 Android 内存不足时,它会杀死后台的活动。

返回应用程序时,Android会从栈顶恢复,所以当Activity调用其他有'static'的killed Activity时,它可能会返回null,因为它还没有恢复。

问题是,静态最终变量怎么样?我的理解是,由于它是最终的,它不会被 Android 清空并保持它的价值,即使 Android 杀死了持有它的 Activity。

用例仅供参考:

活动 A:

private static final String EXTRA_KEY = "key"

void goToB(){
    Intent intent = new Intent(this, B.class);
    intent.putExtra(EXTRA_KEY,"value");
}

活动 B:

void getExtra(){
   getIntent.getExtras(A.EXTRA_KEY);
}

如果我在 Activity B 上,将应用程序置于后台,Android 会因为内存而终止 Activity,A.EXTRA_KEY 是否可能为空?

这也是使用 EXTRA_KEY 作为常量的推荐方法吗?谢谢

【问题讨论】:

  • 在 Android 中内存不足总是一件坏事。尝试通读这篇文章:developer.android.com/topic/performance/memory
  • 常量表达式由编译器(/可能)内联。所以你实际上并没有使用intent.putExtra(EXTRA_KEY,"value");,你实际上(/也许)使用intent.putExtra("key","value");
  • 有一个谣言在流传,它不会消失:JVM 在遇到内存压力时开始“清空”引用。这不是真的。正在发生的事情是,您的应用程序正在从头开始重新启动。 Android 将恢复部分 Activity 堆栈。如果此时任何引用为空,那是因为您的代码在应用程序的最新启动期间未能初始化它们。任何 JVM 都无法更改任何性质的最终引用。正如安迪·特纳(Andy Turner)所说,它甚至可能不作为离散参考存在;它可能是内联的。
  • 感谢它是否在编译时内联或定义,而不是它可能是安全的

标签: java android memory static final


【解决方案1】:

静态变量与类相关联。并且课程很少得到垃圾收集here's a nice answer。由于它可以创建的引用问题,通常在 android 中避免使用静态变量。

这是保持常量值(例如键、url 等)的替代方法

在您的应用 gradle 文件中

buildTypes {
    debug {
        buildConfigField "String", "EXTRA_KEY ", "\"key\""
    }
}

像这样检索它

BuildConfig.EXTRA_KEY 

【讨论】:

  • 您分享的链接非常有用,谢谢!但是由于我的 EXTRA_KEY 不只是一个,我认为放入 BuildConfig 会使它过于混乱:(
  • 只要您只存储密钥,您就可以拥有一个具有常量值(密钥)的public static 类。这是安全的
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多