2011-12-28 184 views
0

我需要在我的应用程序中储存一些数据。 我知道我能做到这一点是这样的:Android - 全局变量?

类:

public class MyApplication extends Application { 

    private String someVariable; 

    public String getSomeVariable() { 
     return someVariable; 
    } 

    public void setSomeVariable(String someVariable) { 
     this.someVariable = someVariable; 
    } 
} 

实现:

MyApp appState = ((MyApp)getApplicationContext()); 
String state = appState.getSomeVariable(); 

这是工作,如果我在一个活动来的。

但是,如果我在一个没有从Activity扩展的类中,如何访问我的数据?

在此先感谢您的帮助!

回答

1

也许通过构造函数或特殊设置函数注入一个类数据所需的全部内容,我会建议前者。 (Constructor Injection vs. Setter Injection

有像静态字段更多的解决方案,但我个人不喜欢这种方法,因为静态有时使单元测试有点混乱。

顺便说一句,你想分享什么样的变量?

0

我使用,它可能是一些静态变量类,你可以从应用程序中的每个类检索一些可怕的。

只需将所有字段创建为静态类,并且可以在整个应用程序中使用它们。它不会被擦除,只有在停止应用程序时才会被擦除。

您也可以将静态变量添加到您的应用程序类。

+2

我原则上,我们从来不明白为什么有些人是反动的。静态存在于语言中是有原因的。有些模式(如singleton)使用它们。 – 2011-12-28 17:23:13

+0

我相信,因为很ofthen静态使用withoud很好的理由,只是利用无处不在访问一个字段 – sll 2011-12-29 10:07:25

0

您可以使用静态方法(或变量,如果它们是公共的)。这的确是一个有些凌乱,但如果他们在,你会赚happinnes和满意度)

static public int getSomeInt(){ 
    //something 
} 

然后以正确的方式(方法)组的任何地方在您的应用程序中使用

int x=MyApplication.getSomeInt(); 

顺便说一句,使用这种风格,你不需要扩展Application类。为这种目的创建一个抽象类更好。

+1

能力也不是线程安全的,使该方法'synchronized' – NikkyD 2011-12-28 17:39:13

5

您可以使用Singleton设计模式。您可以随时随地使用它,因为它具有静态访问权限。

public class SingletonClass { 
private static SingletonClass _instance = null; 
private int _value = 0; 

private SingletonClass() { 
} 

public static SingletonClass getInstance() { 
    if (_instance == null) 
     _instance = new SingletonClass(); 
    return _instance; 
} 

public int getValue() { 
    return _value; 
} 

public void setValue(int value) { 
    _value = value; 
} 

}

,然后访问它像这样:

SingletonClass.getInstance().getValue(); 

注:这是一些编程问题的好和简单的解决方法,但用它很聪明地..它与它的问题

+2

警告,这不是线程安全的! – NikkyD 2011-12-28 17:38:06

+0

这是真实的,但出了问题的范围。我相信一个简单的解决方法的工作原理,使其线程安全:添加需要的地方锁();) – 2011-12-28 18:01:39

+1

以错误的方式非常ofthen单使用,并引入了更多的问题,而大于收益,而在应用程序运行和犯规使用它无需特殊情况 – sll 2011-12-29 10:06:11

0

通过你的活动背景作为一个参数去的方法或类:

// ... 
public void doStuff(Context context) { 
    // for example, to retrieve and EditText 
    EditText et = context.findViewById(R.id.editText1); 
} 

那么,你的活动,你会怎么做:

// ... 
MyClass myClass = new MyClass(); 
// ... 
myClass.doStuff(this); 
// ...