2011-10-12 23 views
14

任何人都可以启发我一个在Android中持有全局值的类的安全性吗?是在Android中保存静态变量的“Globals”类吗?

这里是什么,我的意思是一个简单的例子:

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一旦用户登录,但我不确定是否应该这样做,以及如果我可以使用像这样的Handler。

我在任何地方都能看到一个Android应用程序可能会被杀死,这是否意味着它完全被杀死或者可能只是它的一部分,从而只会导致我的Globals类失效?

或者是有任何其他方式,存储在一个安全的方式在全球范围提供数据,而每一个成员的变化写入数据库(其实,我User类比在这个例子中一点更加复杂。;-)

感谢您的努力!


编辑:好了,这里就是我终于做到:

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节点告诉应用程序使用您的子类。

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

+0

可能的重复[是Android中的静态安全?](http://stackoverflow.com/questions/1203434/is-the-static-safe-in-android) –

+0

@ z00l我不知道你的第二种方法比第一种更好。如果你更容易维护你的代码库,那很好。但是,Android并不会因为应用程序被终止而终止(垃圾回收)全局静态变量(并可能使用相同的活动堆栈重新启动)。请记住,Java是Java,Android是Android。 Android的应用程序管理不一定与Java的全局静态变量的内存分配相同。 –

回答

8

使用Android Application类会更好。这意味着要存储全局应用程序状态

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

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

+7

我不相信Application类的用法是特别必要的。在这个非常文档化的页面上,它指出:“通常不需要继承Application,在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果你的单例需要全局上下文(例如注册广播接收器) ,检索它的函数可以被赋予一个Context,它在第一次构建单例时在内部使用Context.getApplicationContext()。“ – Maximus

+0

哇,我的第一个问题,我在两分钟内得到了令人满意的答案......非常感谢,你的回答真的帮了我很大的忙(据我现在可以说)。 – z00l

+0

@Maximus - 非常真实。这实际上是一个我首选的问题(文档首先声明这个类是为了保持全局状态,你可以提供你自己的实现) –

1

该模式是不鼓励的 - 当单元测试时你会遇到问题。

你能解释一下你如何对一个必须提供不同的自定义“用户”的类进行单元测试吗?你要么将一个模拟/假的类强制到“用户”中,这可能会对其他测试产生交叉影响,或者你将一个if(测试)放入你的代码中,从而变得越来越难看。

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

更简单地说,它很难单独测试一个类。

这是一个给定的程序员不会看到问题或从未使用的模式之一,因为他被烧了 - 你会看到一点中间地带。

+2

- 1,不回答问题。问题是“Globals类在Android中保持静态变量安全吗?” – Pacerier

+0

只有首先回答问题,额外的信息才是好的。首先回答问题,然后添加您认为重要的任何信息。如果您没有答案,请发表评论而不是答案,以便**未答复的问题会获得更多的知名度,并有更高的答案机会。如果您和Andrew未使用答案框发布您的评论,则问题**将被解答**。现在我们有一个问题没有回答3年,潜在的回答者无法看到他们,因为他们没有出现在http://stackoverflow.com/underswered – Pacerier

+0

显然,如果你看看你的downvotes的日期显然他们并不我离开了。事实上,我可以通过在特定的预设时间做出倒计时来证明这一点,并且您确信我没有降低它的投票率。我明白为什么他们低估了你,因为进行搜索的人(如我)显然不会**使用你的答案。通过回答错误的问题,你在这里浪费了游客的时间。你谈论的冗余在哪里? **该问题尚未得到解答**,Android中的Globals类是否保持静态变量安全?答案是什么?是/否 – Pacerier

相关问题