導(dǎo)圖
準(zhǔn)備
一些基本使用方法,這里就不過多介紹,大家可以參考官方文檔.
ps:這里吐槽一下官方的對sharedPreferences的翻譯,叫共享首選項(xiàng).無語,讓我想起了阿賈克斯(AJAX)和酷容(Chrome),一臉黑線
這里簡單總結(jié)一下
SharedPreferences(后面簡稱sp)本身是一個(gè)接口,程序無法直接創(chuàng)建sp的實(shí)例.只能通過Context提供的getSharedPreferences(String name,int mode)方法來獲取sp的實(shí)例.sp本身為接口類型,并沒有提供寫入數(shù)據(jù)的能力,而是通過內(nèi)部接口Editor來實(shí)現(xiàn)寫入數(shù)據(jù)的能力.所以寫數(shù)據(jù)需要通過調(diào)用editor來寫數(shù)據(jù),讀數(shù)據(jù)可以直接用sp的方法實(shí)現(xiàn).
preferences = getSharedPreferences(PREFNAME, MODE_PRIVATE); //1.創(chuàng)建sp
preferences.edit().
putString("time", new SimpleDateFormat().format(new Date())).
putInt("random", ((int) (Math.random() * 100))).
commit(); //2.存
String time = preferences.getString("time", null); //取
int value = preferences.getInt("random", 0);
好了,就是這么簡單.正因?yàn)槭褂煤唵?所以在開發(fā)過程中,使用的頻率也是最多的.
如何調(diào)試
sp在我看來就是一種簡單的存儲方式,本身還是io操作.sp文件也是常見的xml文件,也就是是說我們完全可以通過io的方式來訪問sp文件,其實(shí)就是解析xml文件.只是沒有這個(gè)必要,直接使用sp提供的api很方便簡潔.生成的sp文件放在data/data/<package name>/shared_prefs目錄下,可以通過模擬器直接打開,如果是真機(jī)需要root才能訪問.為了方便調(diào)試,facebook提供了一個(gè)方便的工具,stetho.可以直接在瀏覽器中查看app中的創(chuàng)建的sp文件.非常方便.效果如下
apply和commit的區(qū)別
- commit這種方式很常用,api1中就已經(jīng)加入了.這個(gè)提交修改方式是同步的,會阻塞調(diào)用它的線程,并且這個(gè)方法會返回boolean值告知保存是否成功(如果不成功界赔,可以做一些補(bǔ)救措施)。
- apply 是api9加入的方式,是異步的.AS也會提示大家使用這種方式.
結(jié)論.一般對提交結(jié)果不關(guān)心的會用apply.如果要求確保提交成功,提交成功后有后續(xù)動作的話還是用commit.
存取復(fù)雜數(shù)據(jù)
sp的存在是為了大家保存相對較小的鍵值集合,可以保存布爾值较性、浮點(diǎn)值庐氮、整型值炬转、長整型和字符串.總的來說就是一些簡單的數(shù)據(jù)格式.一般用來保存
軟件設(shè)置、用戶賬戶設(shè)置,用戶習(xí)慣設(shè)置等.但是還是會有人喪心病狂的來保存比較復(fù)雜的數(shù)據(jù).比如對象,圖片.具體做法就是:使用Base64把Product對象和圖片進(jìn)行編碼成字符串后冀膝,然后通過 SharedPreferences 把轉(zhuǎn)換后的字符串保存到xml文件中浮庐,在需要使用該對象或者圖片時(shí)甚负,通過Base64把從 SharedPreferences 獲取的字符串解碼成對象或者圖片再使用。
結(jié)論:雖然可以采用編碼的方式通過sp來保存任何類型的數(shù)據(jù),但是不建議使用sp保存很大的數(shù)據(jù).如果需要存取大數(shù)據(jù),還是通過文件存儲的或者sqlite的方式.這個(gè)我們?nèi)蘸笤诒?
一些坑
- 讀取頻繁的key和不易變動的key盡量不要放在一起审残,影響速度梭域。
- 不要多吃edit多吃apply,像這樣
SharedPreferences sp = getSharedPreferences("test", MODE_PRIVATE);
sp.edit().putString("test1", "sss").apply();
sp.edit().putString("test2", "sss").apply();
sp.edit().putString("test3", "sss").apply();
sp.edit().putString("test4", "sss").apply();
每次edit都會創(chuàng)建一個(gè)Editor對象,額外占用內(nèi)存,另外多吃apply也會卡界面.所以不要無節(jié)制的使用apply.多次修改一次apply.
preferences.edit().
putString("time", new SimpleDateFormat().format(new Date())).
putInt("random", ((int) (Math.random() * 100))).
apply();
- 不要使用這個(gè)用來跨線程,這個(gè)在android中不是很穩(wěn)定,如果需要還是使用ContentProvider.
下級預(yù)告
Android基礎(chǔ)之fragment
參考鏈接
- http://shaohui.me/2016/10/20/%E5%85%B3%E4%BA%8ESharedPreference%E8%B8%A9%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91/
- http://weishu.me/2016/10/13/sharedpreference-advices/
- http://www.reibang.com/p/ae2c7004179d
- http://www.reibang.com/p/4dd53e1be5ba/comments/2931815
- https://developer.android.com/training/basics/data-storage/shared-preferences.html
- https://developer.android.com/guide/topics/data/data-storage.html