静态变量、模式和Android性能



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

首先,我删除了所有的活动引用,以避免任何内存泄漏,但我仍在寻找关于需要在android应用程序中的任何地方使用的静态变量的最佳实践。

我读了很多遍(示例1,示例2):使用静态变量并不是一种必要的好做法,使用一个带有getter和setter的singleton类可以访问我的全局变量,无论我在哪里

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

然后我可以使用例如:

// 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听起来不错,因为这个singleton将这个类的实例化限制为一个对象,而且这个类在应用程序中出现任何不需要的活动之前都不会被销毁,所以这意味着我可以在应用程序的当前生命周期中保留我的全局数据,例如从"登录"中。但是我也可以通过getters/ssetter来维护全局变量的状态。

但后来我也看了一下关于性能提示的官方安卓文档,上面说使用静态变量很好——它更快,别忘了避免内部getter和setter——它太膨胀了!

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

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

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

最新更新