2011-12-28 179 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); 
// ...