1,調用getSharedPreferences();創建壹個SharedPreferences對象,它將首先確定是否存在壹對。
如果xml文件存在,如果找到了,會有壹個預加載操作,將xml文件的內容經過I/O操作和XmlUitl解析後存儲到壹個map對象中,所以我們調用shared preferences::getString();get操作實際上並不對文件做I/O操作,而是直接訪問剛設置的map的內容,提高了效率。如果相應的xml不存在,則重新創建相應的xml文件。
2.放寫操作:寫操作有兩個步驟,壹是將數據寫入內存,也就是映射集,二是將數據寫入硬盤文件。只有這樣才能保證數據的完整性。提交寫操作有兩種方式:
從源代碼解釋來看,commit方法有以下特點
存儲過程是原子操作提交方法有返回值,設置成功為真,否則為假。
同時,SharedPreferences設置值的最後壹次設置將直接覆蓋先前的值。
如果不在乎設置是否成功,並且值是在主線程中設置的,建議使用apply方法。
應用功能如下
存儲的過程也是原子操作。
Apply沒有返回值,所以無法知道存儲是否成功。
申請寫作過程分為兩步。第壹步是同步寫入內存,第二步是異步寫入物理磁盤。並且寫入過程將阻止同壹SharedPreferences對象的其他寫入操作。
很明顯apply方法沒有返回值,用戶無法知道提交是否成功。而且直觀來說,Runnable還有兩種實現。提交過程采用子線程提交,是異步的。
Synchronized關鍵字廣泛用於提交到內存和磁盤的寫操作,以確保線程安全。最後,使用阻塞操作來等待剩余的線程完成它們的操作。因此,提交操作在多線程下是線程安全的。請註意,try-catch用於確保提交過程不會中斷。
對比摘要:
提交和應用是原子操作,其中提交不能被中斷。
Commit有對應的返回值,可以知道操作是否成功,apply沒有返回值。
提交是壹個同步過程,比應用異步提交慢。
commit方法將修改後的數據提交到內存,然後同步提交到硬件磁盤。因此,當提交多個並發提交時,它們會等待提交的數據保存到磁盤後再進行操作,從而降低了效率。
Apply是將修改後的數據提交到內存,然後異步提交到硬件磁盤。