【问题标题】:Static variables, pattern and Android performance静态变量、模式和 Android 性能
【发布时间】:2015-10-28 13:06:05
【问题描述】:

我正在做一些大的重构操作,与 Android 应用程序中的一些性能改进相关,该应用程序使用具有大量静态变量甚至静态活动引用的类,然后通过应用程序使用!因此,我一直在寻找 Android 中的一些最佳实践来存储数据并在我的应用中为这些数据提供全局访问权限。

首先我删除了所有活动引用以避免任何内存泄漏,但我仍然想知道关于需要在 android 应用程序中的任何位置使用的静态变量的最佳做法。

我读了很多遍(example1exemple2):使用静态变量并不是一个好的做法,使用带有 getter 和 setter 的单例类更好/更干净,以便无论活动如何都可以访问我的全局变量我在哪里。所以我开始想的是一个看起来像这样的类:

public class AppSingleton extends Application {

    private static AppSingleton appInstance;

    // different stored data, which could be relative to some settings ..
    private String setting1;
    private String setting2;

    private AppSingleton() {
        super();
        appInstance = new AppSingleton();
    }

    public static  AppSingleton getAppInstance() {
        if (appInstance == null) {
            appInstance = new AppSingleton();
        }
        return appInstance;
    }

    // Getter and Setter for global access
    public String getSetting1() {return setting1;}
    public void setSetting1(String setting1) {this.setting1 = setting1;}

    public String getSetting2() {return setting2;}
    public void setSetting2(String setting2) {this.setting2 = setting2;}
}

然后我可以使用example

// Get the application instance
AppSingleton appS = (App) getApplication();

// Call a custom application method
appS.customAppMethod();

// Call a custom method in my App singleton
AppSingleton.getInstance().customAppSingletonMethod();

// Read the value of a variable in my App singleton
String var = AppSingleton.getInstance().getCustomVariable;

对我来说,AppSingleton 听起来不错,因为这个单例将此类的实例化限制为一个对象,而且在应用程序中有任何未销毁的 Activity 之前,此类不会被销毁,因此这意味着我可以在当前生命周期中保留我的全局数据我的应用程序,例如来自“登录”。但我也可以从我的 getter/setter 中维护我的全局变量的状态。

但后来我还查看了有关Performance Tips 的官方android 文档,其中说使用静态变量很好,它更快,并且不要忘记避免内部getter 和setter 它太膨胀了!

我对所有这些都有些困惑,我真的很想了解更多有关该主题的信息。使用一个类提供对我的代码不同部分所需的某些变量的访问的最佳实践是什么? AppSingeleton 上面的类在架构和性能方面是否会很有趣? 在android中使用单例模式管理全局变量是个好主意吗?

【问题讨论】:

  • 如果这可能有帮助:stackoverflow.com/questions/19774075/…
  • @Nitesh 谢谢你,我已经把它和我的问题联系起来了,它实际上很有帮助,但是当我阅读 android Performance Tips 我也有点困惑..
  • 糟糕的是我再次发布了相同的链接:)..即使我很高兴知道这个问题的答案..

标签: java android performance static singleton


【解决方案1】:

这些行在您的代码中完全错误:

   private AppSingleton() {
        super();
        appInstance = new AppSingleton();
    }

    public static  AppSingleton getAppInstance() {
        if (appInstance == null) {
            appInstance = new AppSingleton();
        }
        return appInstance;
    }

你不能实例化新的Application,Android 框架会实例化它。改为:

   private AppSingleton() {
        super();
        appInstance = this; // keep ref to this application instance
    }

    public static  AppSingleton getAppInstance() {
        return appInstance;
    }

关于全局变量的访问。我相信在您的应用程序的其他地方放置这些单例会更有条理。应用程序类有不同的职责,你不应该用不同的任务重载它。那是面向对象的干净编码。

此外,有时在 Android 应用程序中没有太多理由为所有内容配备 getter/setter,因为您不需要像在大型项目中那样多的访问控制。但这应根据必要性逐案考虑,而不是作为一般规则使用。

所以你可以像这样:

public class Globals {
    private static final Globals instance = new Globals();
    public static Globals get() { return instance; }

    public String value1 = "Hello"
    public int value2 = 42;
}

然后根据需要在您的代码调用中:

Log.d(TAG, Globals.get().value1);
Globals.get().value1 = "World";
Log.d(TAG, Globals.get().value1);
Log.d(TAG, "Value2 = " + Globals.get().value2);

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多