Android --- SharePreference 存储与数据库存储的效率分析
原文鏈接:https://blog.csdn.net/MacaoPark/article/details/114680449
前言
最近到了一家公司,跟一個同事做項目,比如常規(guī)的一些操作用SharedPreferences就很好搞定,他跟我說SharedPreferences 會影響性能說了一堆… 難道別的存儲方式就不耗費性能嗎?不消耗內(nèi)存嗎?
有關Android存儲
Android中的數(shù)據(jù)存儲方案主要有:共享首選項(SharedPreferences)、內(nèi)部存儲(Internal Storage)、外部存儲(External Storage)、SQLite數(shù)據(jù)庫、 網(wǎng)絡存儲 靜態(tài)變量等
SharedPreferences 共享首選項
先說一下SharedPreferences 簡稱SP , SharedPreferences類提供了一個通用框架,使開發(fā)者能夠以鍵值對的方式,永久性的保存一些原始數(shù)據(jù)類型的數(shù)據(jù),包括:布爾值,浮點值,整型值,長整型和字符串,被保存的數(shù)據(jù)可以跨多個用戶會話永久保留(即使應用已經(jīng)終止)。
為什么使用 SP 它的優(yōu)點是什么? 使用SP 為Android開發(fā)者提供了更為便利的存儲方式,但是相對的他也是有一些缺點的。
當我們首次創(chuàng)建 SharedPreferences 對象時,會根據(jù)文件名將文件下內(nèi)容一次性加載到 mMap(SharedPreferencesImpl 成員) 容器中,每當我們 edit 都會創(chuàng)建一個新的 EditorImpl 對象,當修改或者添加數(shù)據(jù)時會將數(shù)據(jù)添加到 mModifiled (EditorImpl 成員)容器中,然后 commit 或 apply 操作比較 mMap 與 mModifiled 數(shù)據(jù)修正 mMap 中最后一次提交數(shù)據(jù),然后寫入到文件中。而 get 直接從 mMap 中讀取。試想如果此時你存儲了一些大型 key 或 value 它們會一直存儲在內(nèi)存中得不到釋放。
(1) 不要存放大的 key 和 value 在 SharedPreferences 中,否則會一直存儲在內(nèi)存中得不到釋放,內(nèi)存使用過高會頻發(fā)引發(fā)GC,導致界面丟幀甚至ANR
(2) 不相關的配置選項最好不要放在一起,單個文件越大讀取速度則越慢。
(3) 讀取頻繁的 key 和不頻繁的 key 盡量不要放在一起(如果整個文件本身就較小則忽略,為了這點性能添加維護得不償失)。
(4) 盡量不要存放 JSON 和 HTML,這種可以直接文件緩存。Json/HTML 文件較小忽略不計!
(5) 不要指望這貨能夠跨進程通信 Context.PROCESS
靜態(tài)變量存儲方式
因為這種方式我與我一個同事有了一些意見不一的地方,他喜歡使用靜態(tài)變量?,F(xiàn)在的開發(fā)是針對于設備開發(fā),而并非手機app的開發(fā),如果app開發(fā)他的那種搞法非得出現(xiàn)問題不可。
因為Activity初始化的靜態(tài)變量也會被置空,因此它的生命周期是不穩(wěn)定的。也就是說,在Android中靜態(tài)變量可能隨時被系統(tǒng)置空,變?yōu)閚ull,其它地方在使用的時候就會產(chǎn)生空指針現(xiàn)象
在Android開發(fā)中不提倡過多使用static類型的變量(除了 static final)因為靜態(tài)變量生命周期較長,而且不易被系統(tǒng)回收,因此如果不能合理地使用靜態(tài)變量,就會適得其反,造成大量的內(nèi)存浪費,所謂過猶不及。
經(jīng)過我的多方查證 建議在具備下列全部條件的情況下,盡量使用靜態(tài)變量:
(1) 變量所包含的對象體積較大,占用內(nèi)存較多。
(2) 變量所包含的對象生命周期較長。
(3) 變量所包含的對象數(shù)據(jù)穩(wěn)定。
(4) 該類的對象實例有對該變量所包含的對象的共享需求。
如果變量不具備上述特點建議你不要輕易地使用靜態(tài)變量,以免弄巧成拙。
對于全局變量使用Android提供了 Application 其生命周期與應用程序共存亡。所以對于全局變量可以寫在 Application。
到底使用哪一種存儲方式?
(1) 如果是簡單的數(shù)據(jù)結構,首選 SharedPreferences
(2) 如果是數(shù)據(jù)量大處理復雜的話,首選是sql數(shù)據(jù)庫 對于結構化的數(shù)據(jù),一定要使用數(shù)據(jù)庫,雖然會顯得比較麻煩,但是后續(xù)的使用中會獲益無窮
(3) 普通文件就是指文本文件,二進制文件,多媒體文件,還有頻繁的讀取要是用二進制文件。
(4) 使用網(wǎng)絡存儲時要避免傳輸大數(shù)據(jù)量數(shù)據(jù),應注意對網(wǎng)絡傳輸方式的優(yōu)化(減少請求次數(shù)等)。
總結
以上是生活随笔為你收集整理的Android --- SharePreference 存储与数据库存储的效率分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】青少年蓝桥杯_每日一题_
- 下一篇: 青少年蓝桥杯_2020_steam考试_