Android之SharedPreferences使用
生活随笔
收集整理的這篇文章主要介紹了
Android之SharedPreferences使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
image.png
getSharedPreferences(String name, int mode)
通過Context調用該方法獲得對象。它有兩個參數,第一個name 指定了SharedPreferences存儲的文件的文件名,第二個參數mode 指定了操作的模式。
mode的模式: Context.MODE_PRIVATE: 指定該SharedPreferences數據只能被本應用程序讀、寫;
Context.MODE_WORLD_READABLE: 指定該SharedPreferences數據能被其他應用程序讀,但不能寫;
Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences數據能被其他應用程序讀;
Context.MODE_APPEND:該模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件; getPreferences(int mode)
通過Activity調用獲得對象。它只有一個參數mode 指定操作模式。這種方式獲取的對象創建的文件 屬于Activity,只能在該Activity中使用,且沒有指定的文件名,文件名同Activity名字。 跨進程不安全。
由于沒有使用跨進程的鎖,就算使用 MODE_MULTI_PROCESS,SharedPreferences 在跨進程頻繁讀寫有可能導致數據全部丟失。根據線上統計,SharedPreferences 大約會有萬分之一的損壞率。 加載緩慢。
SharedPreferences 文件的加載使用了異步線程,而且加載線程并沒有設置優先級,如果這個時候讀取數據就需要等待文件加載線程的結束。這就導致主線程等待低優先線程鎖的問題,比如一個 100KB 的 SP 文件讀取等待時間大約需要 50 ~ 100ms,并且建議大家提前用預加載啟動過程用到的 SP 文件。 全量寫入。
無論是 commit() 還是 apply(),即使我們只改動其中一個條目,都會把整個內容全部寫到文件。而且即使我們多次寫同一個文件,SP 也沒有將多次修改合并為一次,這也是性能差的重要原因之一。 卡頓。
由于提供了異步落盤的 apply 機制,在崩潰或者其它一些異常情況可能會導致數據丟失。所以當應用收到系統廣播,或者被調用 onPause 等一些時機,系統會強制把所有的 SharedPreferences 對象的數據落地到磁盤。如果沒有落地完成,這時候主線程會被一直阻塞。這樣非常容易造成卡頓,甚至是ANR,從線上數據來看 SP 卡頓占比一般會超過 5%。
..
SharedPreferences
Android 五種數據存儲的方式分別為:
| SharedPreferences | 以Map形式存放簡單的配置參數; |
| ContentProvider | 將應用的私有數據提供給其他應用使用; |
| 文件存儲 | 以IO流形式存放,可分為手機內部和手機外部(sd卡等)存儲,可存放較大數據; |
| SQLite | 輕量級、跨平臺數據庫,將所有數據都是存放在手機上的單一文件內,占用內存小; |
| 網絡存儲 | 數據存儲在服務器上,通過連接網絡獲取數據; |
Sharedpreferences是Android平臺上一個輕量級的存儲類,用來保存應用程序的各種配置信息,其本質是一個以“鍵-值”對的方式保存數據的xml文件,其文件保存在/data/data//shared_prefs目錄下。在全局變量上看,其優點是不會產生Application 、 靜態變量的OOM(out of memory)和空指針問題,其缺點是效率沒有上面的兩種方法高。
使用SharedPreferences
獲取SharedPreferences對象
首先要獲取SharedPreferences才能進行操作。獲取SharedPreferences對象有下面兩個方式:
通過Context調用該方法獲得對象。它有兩個參數,第一個name 指定了SharedPreferences存儲的文件的文件名,第二個參數mode 指定了操作的模式。
mode的模式:
通過Activity調用獲得對象。它只有一個參數mode 指定操作模式。這種方式獲取的對象創建的文件 屬于Activity,只能在該Activity中使用,且沒有指定的文件名,文件名同Activity名字。
例子:
mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE ); mActivitySp = this.getPreferences( Context.MODE_PRIVATE );寫數據
步驟1:創建一個SharedPreferences對象
SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);步驟2: 實例化SharedPreferences.Editor對象
SharedPreferences.Editor editor = sharedPreferences.edit();步驟3:將獲取過來的值放入文件
editor.putString("name", “Tom”); editor.putInt("age", 28); editor.putBoolean("marrid",false);步驟4:提交
editor.commit();讀取數據
SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE); String userId=sharedPreferences.getString("name","");刪除指定數據
editor.remove("name"); editor.commit();清空數據
editor.clear(); editor.commit();commit和apply區別
apply函數立即更改內存中的SharedPreferences對象,但異步地將更新寫入磁盤。
commit函數同步地將數據寫入磁盤。在主線程調用它應該多注意,因為可能引起阻塞,引起ANR。
commit有返回值,返回是否成功寫入永久性存儲種。apply沒有返回值。
性能問題
由于沒有使用跨進程的鎖,就算使用 MODE_MULTI_PROCESS,SharedPreferences 在跨進程頻繁讀寫有可能導致數據全部丟失。根據線上統計,SharedPreferences 大約會有萬分之一的損壞率。
SharedPreferences 文件的加載使用了異步線程,而且加載線程并沒有設置優先級,如果這個時候讀取數據就需要等待文件加載線程的結束。這就導致主線程等待低優先線程鎖的問題,比如一個 100KB 的 SP 文件讀取等待時間大約需要 50 ~ 100ms,并且建議大家提前用預加載啟動過程用到的 SP 文件。
無論是 commit() 還是 apply(),即使我們只改動其中一個條目,都會把整個內容全部寫到文件。而且即使我們多次寫同一個文件,SP 也沒有將多次修改合并為一次,這也是性能差的重要原因之一。
由于提供了異步落盤的 apply 機制,在崩潰或者其它一些異常情況可能會導致數據丟失。所以當應用收到系統廣播,或者被調用 onPause 等一些時機,系統會強制把所有的 SharedPreferences 對象的數據落地到磁盤。如果沒有落地完成,這時候主線程會被一直阻塞。這樣非常容易造成卡頓,甚至是ANR,從線上數據來看 SP 卡頓占比一般會超過 5%。
總結
以上是生活随笔為你收集整理的Android之SharedPreferences使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sun公司JES服务器软件已支持更多操作
- 下一篇: 腾讯T3大牛亲自讲解!面试字节跳动And