SharedPreferences模塊封裝

前言

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)

  1. SharedPreferences
    先看下SharedPreferences, 他本身就是interface歉摧,一看就是采用的面向接口編程艇肴,好像在告訴我,我是干這個(gè)的叁温,你別管我咋干的再悼,你需要用就是了~

  2. 定義執(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();
        }
    
        ···
    }
    
    
  • 好像可以了
  1. 理想使用效果
  • 首先是緩存分模塊灭贷,比如用戶信息緩存、設(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類好呢甚疟?
  1. 業(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é)同使用,既能看懂挺尾,又能約束
  1. 執(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();
        }
        ···
    
  1. 緩存管理類
    大功告成鹅搪?還差一步!通過管理類實(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));
        }
    }
    

使用效果

  1. 在Application類中初始化
    PreferenceManager.getInstance().initPreferences(this);
    
  2. 正常使用
    IUserPreferences userPreferences = PreferenceManager.getInstance().getUserPreferences();
    //保存
    userPreferences.saveUserName("Kyne");
    //獲取
    String name = userPreferences.getUserName();
    
    
    舒坦~~

類圖

忘了咋畫了 O——O~甫题!

代碼

代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涂召,隨后出現(xiàn)的幾起案子坠非,更是在濱河造成了極大的恐慌,老刑警劉巖果正,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炎码,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秋泳,警方通過查閱死者的電腦和手機(jī)潦闲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轮锥,“玉大人矫钓,你說我怎么就攤上這事∩岫牛” “怎么了新娜?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)既绩。 經(jīng)常有香客問我概龄,道長(zhǎng),這世上最難降的妖魔是什么饲握? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任私杜,我火速辦了婚禮,結(jié)果婚禮上救欧,老公的妹妹穿的比我還像新娘衰粹。我一直安慰自己,他們只是感情好笆怠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布铝耻。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢捉。 梳的紋絲不亂的頭發(fā)上频丘,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音泡态,去河邊找鬼搂漠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛某弦,可吹牛的內(nèi)容都是我干的桐汤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刀崖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惊科!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亮钦,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎充活,沒想到半個(gè)月后蜂莉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡混卵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年映穗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幕随。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚁滋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赘淮,到底是詐尸還是另有隱情辕录,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布梢卸,位于F島的核電站走诞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛤高。R本人自食惡果不足惜蚣旱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戴陡。 院中可真熱鬧塞绿,春花似錦、人聲如沸恤批。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽开皿。三九已至涧黄,卻和暖如春篮昧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笋妥。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工懊昨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人春宣。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓酵颁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親月帝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容