1. 程式人生 > >SharedPreference在使用過程中有什麼注意點?

SharedPreference在使用過程中有什麼注意點?

commit()和apply()的區別

返回值

apply()沒有返回值,而commit()返回boolean表明修改是否提交成功。

操作效率

apply()是將修改資料原子提交到記憶體, 而後非同步真正提交到硬體磁碟,。

而commit()是同步的提交到硬體磁碟。

因此,在多併發commit()的時候,會等待正在處理的commit儲存到磁碟後再操作,從而降低了效率。

而apply只是原子的提交到內容,後面有呼叫apply的函式的將會直接覆蓋前面的記憶體資料,從一定程度上提高了效率。

建議

如果對提交的結果不關心的話,建議使用apply(),如果需要確保提交成功且有後續操作的話,還是需要用commit()。

多程序表現

是為了回答這個問題

一句話:在多程序中,如果要交換資料,不要使用SharedPreference,因為在不同版本表現不穩定,推薦使用ContentProvider替代。

在有的文章中,有提到在多程序中使用SharedPreference新增下面標誌位就可以了。

MODE_MULTI_PROCESS

但是在官方文件中這樣提到:

This was the legacy (but undocumented) behavior in and
   before Gingerbread (Android 2.3) and this flag is implied when targetting such releases.  
   For applications targetting SDK versions greater than
Android 2.3, this flag must be explicitly set if desired. @deprecated MODE_MULTI_PROCESS does not work reliably in some versions of Android, and furthermore does not provide any mechanism for reconciling concurrent modifications across processes. Applications should not attempt to use it. Instead, they should use an explicit cross-process data management approach such as
ContentProvider

簡單解釋下,就是這個標誌位在2.3之前是預設支援的,但是在2.3之後,如果需要多程序訪問的情景,就需要顯示的宣告出來。

現在這個標誌位被廢棄了,因為在某些版本上表現不穩定。我們開發者不應該嘗試去使用它,因為他沒有提供任何併發機制,我們應該使用一種明確支援跨程序訪問的機制,比如ContentProvider。

使用細節

  • ContextImpl中有一個靜態的ArrayMap變數sSharedPrefs,無論有多少個ContextImpl物件例項,系統都共享這一個sSharedPrefs的Map,應用啟動以後首次使用SharePreference時建立,系統結束時才可能會被垃圾回收器回收,所以如果我們一個App中頻繁的使用不同檔名的SharedPreferences很多時這個Map就會很大,也即會佔用移動裝置寶貴的記憶體空間。所以我們應用中應該儘可能少的使用不同檔名的SharedPreferences,取而代之的是合併他們,減小記憶體使用
  • SharedPreferences在例項化時首先會從sdcard非同步讀檔案,然後快取在記憶體中;接下來的讀操作都是記憶體快取操作而不是檔案操作。
  • 在SharedPreferences的Editor中如果用commit()方法提交資料,其過程是先把資料更新到記憶體,然後在當前執行緒中寫檔案操作,提交完成返回提交狀態;如果用的是apply()方法提交資料,首先也是寫到記憶體,接著在一個新執行緒中非同步寫檔案,然後沒有返回值。
  • 在寫操作commit時有三級鎖操作,效率很低,所以當我們一次有多個修改寫操作時等都批量put完了再一次提交確認,這樣可以提高效率。

更多參考資料

相關推薦

MyBatis使用過程注意

1. 模糊查詢  在查詢時使用動態SQL,其中有一個需求是可以根據名字進行模糊匹配,我在對映檔案mapper是這麼寫的: <select id="list" resultMap="BaseResultMap"> select

python學習過程注意

input返回為str型資料,需要進行資料轉化python中縮排可以在文字編輯器中直接用Tab,Tab和空格混用會報錯list對應[],tuple對應(),dictionary對應{}。對於list,tuple和dictionary的索引用的都是[]python中字元和整型都是不可變的物件,呼叫不可變物件自身

小專案踩坑以及專案過程注意(第一篇)

批量整合後臺頁面 1、修改批量檔案的字尾名,下面將字尾.html改為.php 方法:開啟命令提示符,切換到我們要操作的目錄,用ren *.html *.php   就可以將.html文件改成.php文件 2、sublime中ctrl+shift+F可以對文件中的內

SharedPreference在使用過程什麼注意

commit()和apply()的區別 返回值 apply()沒有返回值,而commit()返回boolean表明修改是否提交成功。 操作效率 apply()是將修改資料原子提交到記憶體, 而後非同步真正提交到硬體磁碟,。 而commi

在學習Python的過程需要注意

  一、學習流程 1.學習過程中(看視訊、直播課程、書籍) 跟上思路 一旦發現不懂的概念, 先記錄在筆記中, 事後再查 搜尋引擎(不要在意百度,谷歌哪個逼格高;自己注意篩選就好) 查不到,或者查到不理解;來群裡吧(516107834)

Spring 整合redis叢集 實現 以及過程需要注意的問題

一,準備工作: 1.首先安裝好redis叢集,啟動並配置叢集。 2.SpringMVC環境,看專案或個人需要,可以使SpringMVC的web專案,也可以是隻使用SpringBean管理器。 二,著手配置: 由於專案是由maven管理的所以需要的jar 包新增到maven

人工智慧和大資料的開發過程需要注意這12

https://www.toutiao.com/i6636522371094151694/   2018-12-19 10:16:15 人工智慧是近年來科技發展的重要方向,在大資料時代,對資料採集、挖掘、應用的技術越來越受到矚目。在人工智慧和大資料的開發過程中,有哪些特別需要注

軟件測試過程哪些風險?

dia bsp HR 人力 選擇 用例 com 重寫 size 那麽到底都有哪些風險要註意呢?如何解決呢?另外這些風險如何在計劃中寫明呢,不會寫“張三可能要離職”,“開發提交代碼可能會延期”吧? 設計方面: 風險:(1)沒有詳細設計說明書; 解決方案:測試人員要在開發階

專案配置過程注意事項

所有人將防火牆永久性關閉,防止出現拒絕訪問情況 systemctl status firewalld 檢視狀態 systemctl stop firewalld 暫時關閉防火牆 systemctl disable firewalld 永久關閉 當遇到maven依賴報錯且不下載的時候,在倉

個人簡歷製作過程注意的地方

簡歷作為一個人求職面試的工具,需要大家好好準備,注意其中的問題,才能製作出一份毫無缺陷的精美簡歷。今天小編就將告訴大家個人簡歷製作當中的禁忌,讓大家在今後製作簡歷時,少犯這些錯誤。1.內容不要重複、過多有得人為了讓簡歷看上去內容豐富,就將一個方面的小內容,不斷在簡歷中重複提出,導致簡歷內容十分混亂,讓人看上去

mysqlexists注意

執行sql: select 1 from dual where exists (select 0); select 1 from dual where exists (select null); 執行結果都是1; mysql> create table t3(id int,t

網站建設過程注意的設計細節

網站建設 相信所有擁有網站的人對於網頁建設的重要性都很瞭解,一個出色的網頁建設設計可以帶給使用者帶來一個好的體驗,而反之也是亦然,可以說網站設計的好壞將影響網頁的流量或是產品的銷售。下面我們來看看在網站建設的過程中應該避免出現的一些錯誤。  1、忘記針對不同裝置優化網頁  要知道,現在的使用者瀏覽網頁已經不再

C語言C++程式設計師應聘過程應當注意些什麼?

既然是面試,一定要提前準備,最好準備一套自我介紹,包括對IT行業的看法之類,面試官經常會問這些問題。 由於c語言是程式設計師工作語種的其中1個,所以對於程式設計師這個工種,還是有一些具體的注意事項: (C/C++企業實戰級課程資源(素材+原始碼+視訊)、編譯大禮包免費分享,需要的加學習群89

依附自媒體平臺推廣過程需要注意的四大事項

自媒體又被稱之為是個人媒體文化指的就是平民化,自主化的傳播者,現代人基本上通過現代的電子化手段,向特定的人群傳遞出各種各樣的資訊,在當今這個新媒體的時代,強調的就是一定要影音文字相互整合的資訊,帶有互動的新媒體就更加具備魅力。同樣也是真正能夠吸引到使用者的原因所在,都說自媒體的內容,如果能夠結合

spring-data-redis 使用過程需要注意的一點(序列化選擇)

在專案中需要用到redis做快取,於是採用spring-data-redis,並且打算自己封裝一個redis的靜態工具類。後來在進行單元測試的過程中發現了一個容易出錯的地方,於是打算記錄下來,並分享給各位朋友。 這裡主要說下碰到的問題,首先,採用了spring-

建站過程注意的問題

建立企業網站就如同寫一篇文章,第一步要寫好提綱,確立主題。企業網站的題材確定後,要想合理地組織內容並且吸引人們登陸網站進行查詢和瀏覽,就需要建立企業網站的索引。索引應該能夠將網站的主體明確表示出來。網站在設立欄目時要緊扣企業確立的主題,設立最近更新或網站指南欄目;設立企業可以下載的檔案、產品資料等文字文件和及

關於urho3d載入資源用法在Lua一些注意 android

起因: 載入場景的做法是Lua函式匯出中使用的是File的形式,在android上無法取到正確的位置,但是cache:GetResource可以獲取到XMLFile所以需要進行修改 這裡修改的檔案 Node.pkg, Scene.pkg Node.h No

Eclipse 轉 Android Studio 的過程必要弄明白的一些問題

AS出來一年多了,最近才從Eclipse轉到AS,但我並不覺得使用Eclipse有多落後,它們都只是一個工具而已,哪個順手就用哪個,用得好都能提高生產力,不會合理利用,再好的工具也是惘然。很多使用Eclipse的Android程式設計師不知道程式碼重構的快捷鍵、如何在執行時除錯、一個Workspace一大堆

移動端開發過程需要注意的問題

1、防止手機中網頁放大和縮小,這點是最基本的,最為手機網站開發者來說應該都知道的,就是設定meta中的viewport <meta name="viewport" content="width=device-width, initial-scale=1.0, max

自動繞線機安裝過程注意事項

自動繞線機在使用之前需要進行正確的安裝,對於第一次購買繞線機的客戶來說,安裝繞線機並不是簡單的工作,星特科技在此簡單的向大家介紹自動繞線機的安裝過程中需要注意的問題。 安裝前 機器開箱時,應有檢查驗收手續.開箱應檢查裝置在運輸中,外觀是否有損傷,對隨機的檔案,隨機附件和工具等進行清點,