2012-12-27 61 views
4

我有幾個2D和3D陣列,我想從我的應用程序中的多個位置訪問,當我的應用程序啓動時,它將從SharedPreferences作爲字符串加載,並在任何活動上調用SharedPreferences時保存回SharedPreferences。在意圖或捆綁的活動之間傳遞它們太繁瑣。有沒有辦法在Android中全局存儲數據?Android - 在哪裏保存全球數據?

回答

1

我們所做的是使用Globals類,它主要使用靜態字段和靜態方法,儘管不是全部都是靜態的。這些主要是應用程序中許多不同類別/活動可能使用的字段和方法。這個問題是不允許它失去控制。每過一段時間,我都會經歷一番,看看可以拿出什麼樣的課,一起上課或搬到現有的課上。有時候,您需要應用程序上下文的問題也是我通過在某些情況下傳遞上下文或創建獲取應用程序上下文的方法解決的。內存泄漏可能存在問題,但到目前爲止我還沒有任何問題,但這並不意味着我不會。

我被告知不要這樣做,它不是OOP,但我認爲這是不正確的,沒有人告訴我爲什麼這是錯誤的。您仍然創建對象並遵循OOP標準。很高興我能幫到

1

我存儲在MyApplication類中,當我需要全局。幾乎可以從任何地方獲得對應用程序/應用程序上下文的引用。

內存泄漏警告:活的對象在簡短的現場收集(如活動)至少我的應用程序是大部分時間居住!

+1

我想這也是我需要的。我們把這些東西放在一個Globals類中,大多數東西都是靜態的,我不認爲這是正確的。我繼承了這段代碼,並試圖清理它。將那些被許多活動使用的方法放在那裏,還是應該放在單獨的類中是否安全? – codeMagic

+0

我還沒有想過要用靜態的東西來製作課堂。實際上,這聽起來很不錯。全局靜態方法有什麼問題? –

+0

是安全的,只要保持儘可能多的代碼可讀。 (並非所有的100個實用函數都有)當MyApplication被破壞時,還有一些額外的情況,但是它的一部分仍然存在。與安全有關,在正常情況下,MyApp是最好的地方,或者從那裏獲得一個持有者到你的班級。 – 2012-12-27 03:01:08

2

如果我需要在SharedPreferences中存儲一些數據,並且需要在我的應用程序中訪問多個地方,那麼我會執行下面的代碼。

public class YourClassName extends Application{ 


    private static YourClassName mClassInstance; 

    public static SharedPreferences mSharedPreferences; 

    public static Editor mEditor; 


    public static String KEY_DB_STATE="DbStateKey"; 

    public static String SHARED_PREFERENCE_NAME="YourClassNamePref"; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mClassInstance=this; 
    } 


    public static YourClassName getInstance(){ 
      checkAppCreated(); 
     return mClassInstance; 
    } 



    public static void checkAppCreated(){ 
     if (mClassInstance == null) 
       throw new IllegalStateException("Application not created yet!"); 
    } 



    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
    } 

    @Override 
    public void onTerminate() { 
     super.onTerminate(); 
    } 


    public static void setDatabaseState(String sharedPreferenceName,boolean state){ 

     mSharedPreferences=getInstance().getSharedPreferences(sharedPreferenceName, Context.MODE_PRIVATE); 
     mEditor=mSharedPreferences.edit(); 
     mEditor.putBoolean(KEY_DB_STATE, state); 
     mEditor.commit(); 

    } 


    public static boolean getDatabaseState(String sharedPreferenceName){ 
     mSharedPreferences=getInstance().getSharedPreferences(sharedPreferenceName, Context.MODE_PRIVATE); 
     return mSharedPreferences.getBoolean(KEY_DB_STATE, false); 
    } 



} 

注:

不要忘記把你的應用程序類在Android清單文件中像下面一個我的課。

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" android:name="com.android.YourClassName">