2

這只是我的應用程序的一個示例。單身共享首選項問題

我已經創建了一個單共享偏好,其使用自定義共享偏好管理器類來編輯共享偏好的數據值:

public class MySharedPrefManager { 
    private static MySharedPrefManager instance= null; 
    private static SharedPreferences SharedPref; 
    private static Editor SPEditor; 

    private MySharedPrefManager() { 
    } 
    public static MySharedPrefManager getInstance(){ 
     if(instance==null) 
      instance= new MySharedPrefManager(); 
     return instance; 
    } 

    public void setSharedPreferences(Context context){ 
     SharedPref= context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE); 
     SPEditor= SPEditor.edit(); 
    } 
    public void setAdmin(boolean pAdmin) { 
     SharedPrefManager.editBoolean("isAdmin", pAdmin, SPEditor); 
    } 
    public boolean isAdmin() {   
     return SharedPref.getBoolean("isAdmin", false); 
    } 
} 

共享偏好管理器:

public class SharedPrefManager { 
    public static void editString(String key, String value, Editor pEditor){ 
     pEditor.putString(key, value); 
     pEditor.commit(); 
    } 
    public static void editBoolean(String key, boolean value, Editor pEditor){ 
     pEditor.putBoolean(key, value); 
     pEditor.commit(); 
    } 

我有大量的活動這就像活動:A-> B-> C-> D-> E-> F-> G

活動A,這是啓動活動,我得到MySharedPrefManager的實例和d設置SharedPreferences也:

public class ActivityA extends Activity{ 
    private MySharedPrefManager myPref; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.initialization); 

     myPref= MySharedPrefManager.getInstance(); 
     // I am setting the SharedPreference Context with getApplicationContext(), 
     // as it is singleton, and I am using it through out my application 
     myPref.setSharedPreferences(getApplicationContext()); 
     // other stuff... 
    } 

    private void changeData(){ 
     myPref.setAdmin(true); 
    } 

    private void check(){ 
     if(myPref.isAdmin()){ 
      // do- something 
     } 
    } 
} 

ActivityD:

public class ActivityD extends Activity{ 

    private MySharedPrefManager myPref; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.initialization); 
     // Here i called only the instance not the setSharedPreferences. 
     myPref= MySharedPrefManager.getInstance(); 

     // other stuff... 
    } 
    private void changeData(){ 
     myPref.setAdmin(true); 
    } 
    private void check(){ 
     if(myPref.isAdmin()){ 
      // do- something 
     } 
    } 
} 

現在,我面對現在的問題是,有時我得到空指針異常的myPref.isAdmin()時我在活動A和D中稱之爲它,但大部分時間都適用。

我還需要在每個活動中設置SharedPreferences(調用setSharedPreferences()方法)嗎?我不覺得需要設置,因爲它是單身類。

我重複一遍,我使用getApplicationContext()設置SharedPreference Context,因爲它是單例,我通過應用程序使用它。

被修改:有3-4個共享首選項,我正在使用相同的結構..有類似的問題。 PreferenceManager.getDefaultSharedPreferences(context);使用這個PreferenceManager.getDefaultSharedPreferences(context);,我將只能使用一個SharedPreference,它是默認的SharedPreference。

+1

嘗試'PreferenceManager.getDefaultSharedPreferences(context);' – Pr38y 2014-10-09 06:54:26

回答

1

在使用MySharedPrefManager的數據成員或內容之前,請檢查空檢查。

在MySharedPrefManager類添加的吸氣劑的方法是這樣的:

public SharedPreferences getSharedPreference(){ 
    return SharedPref; 
} 

在活動你在哪裏訪問共享偏好內容,在的onCreate或的onResume使用內容之前添加此:

myPref= MySharedPrefManager.getInstance(); 
if(myPref.getSharedPreference()==null){ 
    myPref.setSharedPreferences(getApplicationContext()); 
} 

這樣你就可以避開NPE。

0

沒有必要,那裏已經有一個單身人士。你可以這樣做:

PreferenceManager.getDefaultSharedPreferences(context); 
+0

請參閱編輯部分 – OnePunchMan 2014-10-09 07:04:54

1

空指針異常可能是由您的單例沒有被初始化引起的。我想這是在你旋轉你的設備時發生的?

我預計會發生以下情況:在活動A中,您做getInstance()setSharedPreferences()。在活動B中,您只需執行getInstance(),並期望獲得與A中創建的實例相同的實例。但是,如果您在B中旋轉設備,則會重新創建B,但是這次它必須自己創建它的實例。這次它不會用setSharedPreferences()進行初始化。

我的建議是讓你的首選課更簡單。確保你在施工初始化。即不要分開出getInstance()setSharedPreferences()。做這樣的事情:

public class MySharedPrefManager { 
    private SharedPreferences sharedPref; 

    private MySharedPrefManager(Context context) { 
     sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 
    } 

    public static MySharedPrefManager from(Context context) { 
     return new MySharedPrefManager(context); 
    } 

    public void setAdmin(boolean pAdmin) { 
     sharedPref.edit().putBoolean("isAdmin", pAdmin).apply(); 
    } 

    public boolean isAdmin() { 
     return sharedPref.getBoolean("isAdmin", false); 
    } 
} 

而當你需要做多項設置這樣使用它:

MySharedPrefManager prefs = MySharedPrefManager.from(this); 
prefs.setAdmin(true); 
prefs.setSomethingElse(); 
boolean isFoo = prefs.isFoo(); 

或者使用較短的版本,如果你只需要一個設定:

MySharedPrefManager.from(this).setAdmin(true);