前言
SharedPreferences 輕量級(jí)緩存使用眾所周知概疆。但是使用極其繁瑣儡遮,那么現(xiàn)在來封裝優(yōu)化一下。
目錄
目錄.jpg
基本原理
SharedPreferences是以XML<->Map鍵值對(duì)的形式保存在/data/data/包名/shared_prefs文件夾下障般。
注意:
- app首次使用 SP 的時(shí)候會(huì)從磁盤讀取丰辣,之后緩存在內(nèi)存中。
- 區(qū)別于其他緩存翼闽,他是每次都是重新寫入拾徙,之前的xml文件會(huì)被改為備份文件,如果操作成功感局,備份文件就會(huì)刪除尼啡。
進(jìn)一步了解自行查看源碼暂衡。
基本使用
SharedPreferences sharedPreferences= getSharedPreferences("user",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username", username);
editor.commit();
問題定義
- edit 獲取不爽,太麻煩
- 每次獲取SharedPreferences實(shí)例還需要傳入name玄叠,那我要是忘了呢古徒?
- put時(shí)要傳入key值,這要是團(tuán)隊(duì)協(xié)作读恃,使用到緩存的信息,還要去查看他的key值代态,不科學(xué)寺惫,要是數(shù)據(jù)多了豈不更麻煩
- 每次都要commit,就不能給他封裝了嘛~~
一看就不是自己人蹦疑,用它給我干活不放心啊西雀,給他包裝下~
思路與實(shí)現(xiàn)
SharedPreferences
先看下SharedPreferences, 他本身就是interface歉摧,一看就是采用的面向接口編程艇肴,好像在告訴我,我是干這個(gè)的叁温,你別管我咋干的再悼,你需要用就是了~定義執(zhí)行部分
- 自己定義方法,創(chuàng)建SharedPreferences實(shí)例膝但,實(shí)現(xiàn)執(zhí)行冲九,先把edit的獲取包起來, 那就創(chuàng)建個(gè)類跟束,通過構(gòu)造函數(shù)給他實(shí)例化
public class BasePreference { private SharedPreferences sharedPreferences; private SharedPreferences.Editor editor; public BasePreference(Context context, String name) { sharedPreferences = context.getSharedPreferences(name, Activity.MODE_PRIVATE); editor = sharedPreferences.edit(); } }
- 這樣獲取到了edit莺奸,使用他還要實(shí)現(xiàn)SharedPreferences的方法,那我就自己定義個(gè)~
public interface ISharePreferences { SharedPreferences.Editor putString(String key, String value); SharedPreferences.Editor putStringSet(String key, Set<String> values); SharedPreferences.Editor putInt(String key, int value); SharedPreferences.Editor putLong(String key, long value); SharedPreferences.Editor putFloat(String key, float value); SharedPreferences.Editor putBoolean(String key, boolean value); SharedPreferences.Editor remove(String key); SharedPreferences.Editor clear(); boolean commit(); void apply(); String getString(String key, String defValue); ··· }
- 這是使用的基本方法冀宴,給BasePreference實(shí)現(xiàn)
public class BasePreference implements ISharePreferences { private SharedPreferences sharedPreferences; private SharedPreferences.Editor editor; public BasePreference(Context context, String name) { sharedPreferences = context.getSharedPreferences(name, Activity.MODE_PRIVATE); editor = sharedPreferences.edit(); } @Override public SharedPreferences.Editor putString(String key, String value) { return editor.putString(key, value); } @Override public String getString(String key, String defValue) { return sharedPreferences.getString(key, defValue); } @Override public SharedPreferences.Editor clear() { return editor.clear(); } @Override public boolean commit() { return editor.commit(); } ··· }
- 好像可以了
- 理想使用效果
- 首先是緩存分模塊灭贷,比如用戶信息緩存、設(shè)置配置緩存等等
public class UserPreferences { private static final String TAG ="UserPreferences"; public UserPreferences(Context context) { }
- 然后使用不能太費(fèi)勁略贮,直接看類名就知道干啥的才行,定義功能接口
public interface IUserPreferences { String getUserName(); void saveUserName(String value); }
- 實(shí)現(xiàn)功能
public class UserPreferences implements IUserPreferences { ··· }
- 怎么用Base類好呢甚疟?
- 業(yè)務(wù)功能和公用功能分離
- 正常使用執(zhí)行類,還需要引入ISharePreferences接口對(duì)象刨肃,實(shí)現(xiàn)包裝父類古拴。
public interface IPreference { ISharePreferences getPreferences(); void commit(); void clear(); void remove(String key); } public class DefaultPreference implements IPreference { private ISharePreferences sharePreferences; public DefaultPreference(Context context, String name){ sharePreferences = new BasePreference(context, name); } @Override public ISharePreferences getPreferences() { return sharePreferences; } @Override public void commit() { getPreferences().commit(); } @Override public void clear() { getPreferences().clear().commit(); } }
- 這樣公用功能和ISharePreferences對(duì)象在父類實(shí)現(xiàn)真友,還差一點(diǎn)黄痪,name還要傳入構(gòu)造函數(shù),下面來去掉盔然,模塊類名作為name自動(dòng)傳入
public class DefaultPreference implements IPreference { private String TAG = "DefaultPreference"; private ISharePreferences sharePreferences; public DefaultPreference(Context context){ sharePreferences = new BasePreference(context, getPreferenceName()); } public String getPreferenceName() { return TAG; } ··· }
- 這樣繼承父類后桅打,覆蓋該方法即可是嗜,如果是多人協(xié)同使用,既能看懂挺尾,又能約束
- 執(zhí)行和使用結(jié)合
- 繼承DefaultPreference, 同時(shí)調(diào)整Key的規(guī)范
public class UserPreferences extends DefaultPreference implements IUserPreferences { private static final String TAG ="UserPreferences"; public UserPreferences(Context context) { super(context); } @Override public String getPreferenceName() { return TAG; } @Override public String getUserName() { return getPreferences().getString(IUserConstant.USER_NAME,null); } @Override public void saveUserPassword(String value) { getPreferences().putString(IUserConstant.USER_NAME,value).commit(); } ···
-
緩存管理類
大功告成鹅搪?還差一步!通過管理類實(shí)現(xiàn)緩存類的管理遭铺,并在app啟動(dòng)時(shí)單例實(shí)例化丽柿,防止頻繁獲取緩存對(duì)象,導(dǎo)致內(nèi)容問題魂挂。public class PreferenceManager extends BasePreferenceManager { private static volatile PreferenceManager instance; private IUserPreferences userPreferences; public static PreferenceManager getInstance() { if (instance == null) { synchronized (PreferenceManager.class) { if (instance == null) { instance = new PreferenceManager(); } } } return instance; } public IUserPreferences getUserPreferences() { return userPreferences; } private void setUserPreferences(IUserPreferences userPreferences) { this.userPreferences = userPreferences; } public void initPreferences(Context context) { PreferenceManager.getInstance().setUserPreferences(new UserPreferences(context)); } }
使用效果
-
在Application類中初始化
PreferenceManager.getInstance().initPreferences(this);
-
正常使用
舒坦~~IUserPreferences userPreferences = PreferenceManager.getInstance().getUserPreferences(); //保存 userPreferences.saveUserName("Kyne"); //獲取 String name = userPreferences.getUserName();
類圖
忘了咋畫了 O——O~甫题!