静态变量,模式和Android性能

时间:2015-10-28 13:06:05

标签: java android performance static singleton

我正在做一些重大的重构操作,相对于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中使用单例模式管理全局变量是不是一个好主意?

1 个答案:

答案 0 :(得分:0)

这些代码行完全错误:

   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;
    }

关于访问全局变量。我相信将这些单身人士放在你申请的其他地方更有条理。应用程序类有不同的职责,不应该用不同的任务重载它。这是OO清洁编码。

此外,有时在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);