Android 是一个;“全球”;在安卓安全中保存静态变量的类?

Android 是一个;“全球”;在安卓安全中保存静态变量的类?,android,static,global,Android,Static,Global,有人能告诉我Android中持有全局值的类的安全性吗 这里有一个简短的例子来说明我的意思: public class Globals { public static int someVariable = 0; public static User currentUser = null; public static Handler onLogin = null; } 然后在活动中的某个地方执行以下操作: Globals.someVariable = 42; Globals

有人能告诉我Android中持有全局值的类的安全性吗

这里有一个简短的例子来说明我的意思:

public class Globals {
    public static int someVariable = 0;
    public static User currentUser = null;
    public static Handler onLogin = null;
}
然后在
活动中的某个地方执行以下操作:

Globals.someVariable = 42;
Globals.currentUser = new User("John", "Doe");
用户登录后,我必须在我的应用程序中的多个位置使用
Globals.currentUser
,但我不确定是否应该这样做,也不确定是否可以使用这样的处理程序

我到处都读到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”
添加到
应用程序
节点,以告知应用程序使用您的子类


到目前为止,一切正常,我可以通过调用
MyApp.getContext()

轻松访问当前的
Context
(f.ex.in
SQLiteOpenHelper
),最好使用安卓
应用程序
类。它用于存储全局应用程序状态


只需创建一个子类,并确保更新清单文件以使用您的版本。然后你可以在里面储存你需要的任何东西。活动有一个方法
getApplication()
,您可以将该方法强制转换到类以访问您的实现

不鼓励使用该模式--在进行单元测试时,您将遇到问题

您能解释一下如何单元测试一个必须在这里提供不同自定义“用户”的类吗?您要么将模拟/伪类强制放入“User”中,这可能会对其他测试产生交叉影响,要么将if(测试)放入代码中,这很快就会变得难看

随着时间的推移,人为地填充这个类进行测试变得越来越复杂,并且开始有关系和依赖关系

更简单地说,它使孤立地单元测试类变得困难


这是一种模式,一个给定的程序员要么没有发现问题,要么从未使用过,因为他已经被烧死了——你会看到一点中间立场。

我不认为应用程序类的使用是特别必要的。在这个文档化的页面上,它指出,“通常不需要对应用程序进行子类化。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),可以为检索它的函数提供一个上下文,该上下文在首次构造singleton时在内部使用Context.getApplicationContext()。“哇,我的第一个问题,我在两分钟内得到了满意的答案。。。非常感谢,你的回答真的帮了我的忙(就我目前所知)。我认为这不是OP想要的安全方式。应用程序的整个过程都可以终止。重新创建时,任何应用程序实例变量都将处于初始状态。例如,请参见,特别是从大约4分钟开始。@TedHopp-我认为他不希望在静态类中持久化数据。我认为他更希望在加载一次数据(而不是从数据源多次加载)后,让多个活动能够访问数据@z00l-如果您将值保存在一个全局类中,并使用getter/setter而不是允许公共访问,那么每次设置变量时,setter都可以确保它被持久化。然后,当Globals对象初始化时,它可以恢复持久化的值。那么就没有必要使用
onSaveInstanceState
。可能重复@z00l我不知道您的第二种方法是否比第一种方法更好。如果这样更容易维护代码库,那就好了。但是Android不会仅仅因为应用程序被终止(并且可能使用相同的活动堆栈重新启动)而终止(垃圾收集)全局静态变量。记住,Java就是Java,Android就是Android。Android对应用程序的管理不一定与Java对全局静态变量的内存分配相同-​1、不回答问题。问题是“在Android中保存静态变量的Globals类是否安全?”只有在首先回答这个问题时,额外的信息才是好的。首先回答问题,然后添加您认为重要的信息。如果你没有答案,发表评论而不是答案,这样未回答的问题会更容易被发现,并且有更高的被回答的机会。如果您和Andrew没有使用答案框发布您的评论,那么问题就会得到回答。现在,我们有一个问题已经三年没有回答了,潜在的回答者没有看到他们,因为他们没有清晰地出现。如果你看一下你投反对票的日期,很明显他们不是我的。事实上,我可以通过在一个特定的预设时间投反对票来证明这一点,你会确信我没有投反对票。我也理解他们为什么否决你,因为人们(像我一样)在搜索某个特定的答案时,显然根本无法使用你的答案。你回答错误的问题是在浪费来访者的时间。你说的冗余在哪里?问题还没有得到回答,在Android中保存静态变量的Globals类是否安全?答案是什么?是/否我想你第一次评论中的-1误导了我。至于答案,被接受的答案比回答问题更能解决问题——这就是为什么它被接受的原因。如果有人问“用枪或药丸自杀更好吗”,答案不是“枪”或“药丸”。