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