当前位置: 首页 > 知识库问答 >
问题:

静态变量、模式与Android性能

莫誉
2023-03-14

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

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

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/setters中维护全局变量的状态。

但是我也看了一下关于性能技巧的官方android文档,它说使用静态变量很好,它更快,不要忘记避免内部getter和setter,它太扩展了!

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

共有1个答案

董高洁
2023-03-14

代码中的那些行是完全错误的:

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

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

您不能实例化新的应用程序,Android框架将实例化它。更改为:

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

    public static  AppSingleton getAppInstance() {
        return appInstance;
    }

关于全局变量的访问。我相信在你的申请中的其他地方有这些单人会更有条理。应用程序类有不同的职责,您不应该用不同的任务过载它。那是OO干净的编码。

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);
 类似资料:
  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 问题内容: 我正在使用仅包含静态变量的类来存储所有常量和运行时属性。但是,最近我看到了引用这些变量的实例,但得到的却是null。 以下是我的课程定义: 我没有存储任何引用实例化PlayerProperties类,因为其中包含的所有变量都是静态的。 当我使用引用变量androidId时,我有时会得到null。 我已经在活动之一中初始化了变量: 我的怀疑是,垃圾收集器在两者之​​间被android踢了

  • 静态变量和实例变量之间的区别是什么。下面这句话是我无法理解的: 在某些情况下,一个类的所有对象只能共享一个特定变量的副本——这里使用静态变量。 静态变量代表类范围的信息。一个类的所有对象共享相同的数据。 我认为实例变量在类范围内使用,而静态变量只在它们自己的方法中有作用域?

  • 本文向大家介绍PHP 静态属性和变量,包括了PHP 静态属性和变量的使用技巧和注意事项,需要的朋友参考一下 示例 用public可见性定义的静态类属性在功能上与全局变量相同。可以从定义类的任何位置访问它们。 函数也可以在自己的范围内定义静态变量。这些静态变量通过多个函数调用持久化,这与在函数范围内定义的常规变量不同。这是实现Singleton设计模式的非常简单的方法:            

  • 静态变量 PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 PHP中的静态变量通过

  • 问题内容: 通常,最终静态成员,尤其是变量(或静态最终变量,当然可以以任何顺序使用,而不会重叠含义)已广泛用于Java接口中,以定义实现类的 协议行为 ,这意味着实现该类的类(继承)接口必须包含该接口的所有成员。 我无法区分 final 和 final静态 成员。final静态成员是一个声明为final或其他东西的静态成员?在哪些特定情况下应专门使用它们? 永远不能在方法内部,静态方法内部或实例方