java - 如何在 Android 中的所有 Activity 中维护变量?

标签 java android

我有一个包含 3 个 Activity 的应用程序。

  • Activity 1
  • Activity 2
  • Activity 3

当用户打开应用程序时,我将获取用户的位置并将其存储在 Helper 类的静态变量中。假设变量是 latlng。现在我需要访问 Activity2 中 latlng 变量的值。所以我只是在 Activity2 中使用 Helper.latlng 。大多数时候它工作得很好。

但是,如果我按主页按钮并打开其他应用程序,然后返回我的应用程序,我的应用程序强制关闭。调试后我发现 Activity2 中 latlng 变量变为 null。

所以,在查阅了各种文档之后,我发现如果有很多应用程序正在运行,那么Android操作系统可能会杀死一些应用程序。所以基本上,如果我打开其他应用程序,我当前的 Activity 就会被操作系统破坏。所以我所有的静态变量都会自动消失。

解决这个问题的一种方法是继续使用静态变量和 onSavedInstanceState 方法,该方法在 Activity 被销毁时调用。

   public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        LatLng latLng  = Helper.latlng;
        outState.putParcelable("latlng",latLng);
    }

并使用

检索它
 if( savedInstanceState != null ) {
            Helper.latlng = savedInstanceState.getParcelable("latlng");
        }

我真的很困惑是否应该采用上述方法。还有其他方法可以在 Android 的不同 Activity 中使用变量吗?根据我的经验,我可以说使用静态变量不是一个安全的选择。

最佳答案

只是为了摆脱最重要的部分:除非您确切知道自己在做什么,否则永远不要在 Android 中使用静态变量。否则,您将导致内存泄漏和其他一系列问题。

如果您想将数据传递给另一个 Activity,您应该使用 Intents。

方法调用总是有额外的开销。直接访问字段总是会更快。但这并不意味着您应该完全放弃 getter 和 setter。

例如看看这个类的例子:

public class Example { 

private String text;

public String getText() {
    return text;
} 

public void setText(String text) {
    this.text = text;
} 

public void doSomething() { 
    ... 
} } 

在 doSomething() 内部,您应该直接使用该字段。在那里调用 getter 和 setter 并不是一种可行的方法,因为每次调用时都需要额外的开销。

如果您在另一个类中使用示例类,如下所示,您应该使用 getter 和 setter 方法: Example instance = new Example(); instance.setText("一些文本"); ... 字符串文本 = instance.getText();

将字段公开并像instance.text一样直接访问它会很糟糕。

但是任何现代设备都具有如此强大的计算能力,以至于方法调用产生的开销完全可以忽略不计。 The DOC确实声明您应该避免在性能关键的地方使用 getter 和 setter,但该规则是从大多数 Android 手机具有 128 MB RAM 的时候开始的。您应该遵守我上面解释的规则的主要原因只有一件事:编码风格。

您首先关心的应该始终是编写干净、可读且可维护的代码。

关于java - 如何在 Android 中的所有 Activity 中维护变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660174/

相关文章:

java - IntelliJ : class variable javadoc to be inserted on getter/setter generation

java - 我向谷歌发送批量请求时做错了什么?

android - 使最后一个 RecyclerView Item 填充 RecyclerView 中的空间(如果数据计数为奇数)

android - 如何使用来自不同 DAO 的函数并使用协程与 Room 进行数据库事务?

iphone - 多平台(android/iphone)聊天

java - 使用 List 更新 SQL 数据库 - Java 和 MyBatis

java - 为什么 Class.forName() 对我不起作用?

java - 如何用 Java 编写系统首选项?我可以调用 UAC 吗?

带有 View 寻呼机的android动态文本

android - 当 JSON 数据是动态的时,如何在 Android 中进行改造?