在Android中安装静态变量的“Globals”类是否安全?

时间:2011-10-12 17:45:21

标签: android static global

任何人都可以启发我关于在Android中持有全球价值观的类的安全性吗?

以下是我的意思的简短例子:

public class Globals {
    public static int someVariable = 0;
    public static User currentUser = null;
    public static Handler onLogin = null;
}

然后在Activity的某处,我执行以下操作:

Globals.someVariable = 42;
Globals.currentUser = new User("John", "Doe");

一旦用户登录,我就必须在我的应用中的多个位置依赖Globals.currentUser,但我不确定是否应该这样做,以及我是否可以使用像这样的处理程序。

我到处读到Android应用程序可能随时被杀死,这是否意味着它被完全杀死或者只是其中的一部分,因此仅杀死我的Globals课程?

或者是否存在以安全的方式存储全局可用数据的任何其他方式,而无需将每个成员更改写入数据库(事实上,我的User类是 little 更复杂比这个例子。; - )

感谢您的努力!


编辑:好的,这就是我最终做的事情:

public class MyApp extends Application {

    private static MyApp _instance;

    public MyApp() {
        super();
        _instance = this;
    }

    public static MyApp getContext() {
        return _instance;
    }
    ....
    private User _user = null;
    public User getUser() {
        if (_user == null) _user = new User();
        return _user;
    }
}

然后修改AndroidManifest.xml并将android:name=".MyApp"添加到application节点,告诉应用使用您的子类。

到目前为止一切正常,我可以通过调用Context轻松访问当前SQLiteOpenHelperMyApp.getContext()中的f.ex.)。

2 个答案:

答案 0 :(得分:8)

最好使用Android Application类。它旨在存储全局应用程序状态

http://developer.android.com/reference/android/app/Application.html

只需创建一个子类,并确保更新清单文件以使用您的版本。然后你可以存储你需要的任何东西。活动有一个方法getApplication(),您可以将其投射到您的班级以访问您的实现

答案 1 :(得分:1)

不鼓励这种模式 - 在单元测试时会遇到问题。

您能解释一下如何对必须在此处提供不同自定义“用户”的类进行单元测试吗?您要么将模拟/假冒类强制转换为“用户”,这可能会对其他测试产生交叉影响,或者您在代码中添加了if(测试),这很快就会变得难看。

随着时间的推移,人工填充此类进行测试变得更加复杂,并开始建立关系和依赖关系。

更简单的是,它很难单独测试一个类。

这是其中一种模式,给定的程序员要么没有看到问题,要么从未使用过,因为他被烧了 - 你会看到很少的中间立场。