java - 静态变量、模式和 Android 性能

标签 java android performance static singleton

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

首先我删除了所有 Activity 引用以避免任何内存泄漏,但我仍然想知道关于需要在 Android 应用程序中的任何地方使用的静态变量的最佳实践是什么。

我读了很多遍(example1exemple2):使用静态变量并不是一个好的实践所必需的,无论 Activity 如何,使用一个带有 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 维护我的全局变量的状态。

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

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

最佳答案

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

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

关于java - 静态变量、模式和 Android 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33391866/

相关文章:

android - Web API 调用在设备模式下失败,但在 Cordova 的模拟器中工作

android - 使用http请求在 fragment 中加载数据

python - 提高使用 for 循环的代码的性能

javascript - 如何使点击的元素突出显示?

java - Android,Java通过HttpClient-HttpPut

java - Android - 如何监听蓝牙输出流被清空

Java 控制台在 Ubuntu 上的屏幕自动启动中运行

java - 从urlconnection的输入流中读取时速度变慢(即使使用byte []和缓冲区)

android - 如何为日 View 、周 View 日历创建布局?

PHP 高性能搜索文本中的给定用户名