Android本地存儲(chǔ)工具Reservoir替代SharedPreferences

SharedPreferences使用起來有些局限渣淤,以及它調(diào)用比較復(fù)雜岖瑰,并且只支持基本數(shù)據(jù)類型和String的存儲(chǔ),不支持自定義對(duì)象存儲(chǔ)砂代。記得以前有次為了不使用SQLite整個(gè)項(xiàng)目又只為了存儲(chǔ)一個(gè)對(duì)象,我只得把對(duì)象轉(zhuǎn)成JsonString率挣,再把JsonString作為字符串存入SharedPreferences刻伊。

后來接觸到Reservoir后用它進(jìn)行本地存儲(chǔ)輕量級(jí)的數(shù)據(jù),一直使用至今椒功。Reservoir是使用DiskLruCache建立磁盤緩存進(jìn)行存儲(chǔ)捶箱,當(dāng)應(yīng)用卸載時(shí),緩存也會(huì)被系統(tǒng)清除动漾。DiskLruCache也是開發(fā)者常用的圖片緩存技術(shù)之一丁屎。

GitHub地址:
https://github.com/anupcowkur/Reservoir
gradle鏈接:
implementation 'com.anupcowkur:reservoir:3.1.0'
開始Reservoir食用

在項(xiàng)目的build.gradle中添加


buildscript {
    ...
    repositories {
        jcenter()
    }
    ...
}

在app的build.gradle中添加依賴

dependencies {
    ...
    // 本地存儲(chǔ)替代shareprefer
    implementation 'com.anupcowkur:reservoir:3.1.0'
    ...
}

此時(shí)已經(jīng)完成Reservoir的所有導(dǎo)入步驟。

在項(xiàng)目中使用時(shí)需要先給Reservoir開辟內(nèi)存空間做初始化旱眯,單位:bytes晨川。
例子中我在Activity的onCreate()中進(jìn)行了初始化,當(dāng)然它也可以在Application中的onCreate()或是Fragment里初始化删豺,關(guān)鍵是要獲得到Context即可共虑。

class TestActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化
        Reservoir.init(this, 2048)
    }
}

建立自己的Reservoir管理類,如下代碼演示了一個(gè)String呀页、自定義對(duì)象妈拌、以及List的存儲(chǔ)方式,其余類型就不一一舉例蓬蝶,畢竟存儲(chǔ)對(duì)象和List才是關(guān)鍵尘分。

object ReservoirHelper {
    ...
    // 所在城市
    fun setCity(city: String) {
        Reservoir.put("city", city)
    }

    fun getCity(): String {
        if (Reservoir.contains("city"))
            return Reservoir.get("city", String::class.java)
        else
            return "北京市"
    }

    // 天氣數(shù)據(jù)
    fun setWeatherFreeInfo(weatherFreeInfo: WeatherFreeInfo) {
        Reservoir.put("weatherFreeInfo", weatherFreeInfo)
    }

    fun getWeatherFreeInfo(): WeatherFreeInfo {
        if (Reservoir.contains("weatherFreeInfo"))
            return Reservoir.get("weatherFreeInfo", WeatherFreeInfo::class.java)
        else
            return WeatherFreeInfo()
    }

    // 房間數(shù)據(jù)
    fun setRoomList(roomList: List<Room>) {
        Reservoir.put("roomList", roomList)
    }

    fun getRoomList(): List<Room> {
        if (Reservoir.contains("roomList"))
            return Reservoir.get("roomList", object : TypeToken<List<Room>>() {}.type)
        else
            return ArrayList()
    }
    ...
}

接下來我們就可以調(diào)用管理類進(jìn)行數(shù)據(jù)存儲(chǔ)猜惋,此處只舉例了List的存取

        val roomList = ArrayList<Room>()
        val r1 = Room()
        val r2 = Room()
        val r3 = Room()
        roomList.add(r1)
        roomList.add(r2)
        roomList.add(r3)
        // 進(jìn)行存儲(chǔ)
        ReservoirHelper.setRoomList(room)
        // 進(jìn)行讀取
        val roomList = ReservoirHelper.getRoomList()
        Log.d(TAG, "-->> 第二個(gè)房間溫度是${roomList[1].temperature}℃")

只要封裝得當(dāng),即可在項(xiàng)目低耦合的引用到它培愁。它可以出現(xiàn)在任何地方著摔,任何地方,任何地方(重要的事情說三遍)竭钝,任何一個(gè)獨(dú)立的Java類都可以進(jìn)行存取操作梨撞。

Reservoir常用方法

UI線程存取方法:

        // 存
        Reservoir.put("myKey", myObject)
        // 取
        Reservoir.get("myKey", MyClass.class)

異步存取方法:

        Reservoir.putAsync("myKey", myObject, object : ReservoirPutCallback {
            override fun onSuccess() {
                //success
            }

            override fun onFailure(e: Exception) {
                //error
            }
        })

        Reservoir.getAsync<MyClass>("myKey", MyClass::class.java, object : ReservoirGetCallback<MyClass> {
            override fun onSuccess(myObject: MyClass) {
                //success
            }

            override fun onFailure(e: Exception) {
                //error
            }
        })

檢查是否存在:

        val isExists = Reservoir.contains("myKey")

刪除:

        // UI線程執(zhí)行刪除
        Reservoir.delete("myKey")

        // 異步刪除
        Reservoir.deleteAsync("myKey", object : ReservoirDeleteCallback {
            fun onSuccess(myObject: MyClass) {
                //success
            }

            override fun onFailure(e: Exception) {
                //error
            }
        })

清空Reservoir的緩存:

        Reservoir.clear()

        Reservoir.clearAsync(object : ReservoirClearCallback {
            override fun onSuccess() {
                try {
                    assertEquals(0, Reservoir.bytesUsed())
                } catch (e: Exception) {

                }

            }

            override fun onFailure(e: Exception) {

            }
        })

到此,Reservoir已經(jīng)食用差不多香罐,需要深度學(xué)習(xí)與RxJava交互卧波,可以參考開頭的GitHub原作者鏈接進(jìn)行學(xué)習(xí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庇茫,一起剝皮案震驚了整個(gè)濱河市港粱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旦签,老刑警劉巖查坪,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宁炫,居然都是意外死亡偿曙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門羔巢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來望忆,“玉大人,你說我怎么就攤上這事竿秆∑羯悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵幽钢,是天一觀的道長歉备。 經(jīng)常有香客問我,道長匪燕,這世上最難降的妖魔是什么蕾羊? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮帽驯,結(jié)果婚禮上肚豺,老公的妹妹穿的比我還像新娘。我一直安慰自己界拦,他們只是感情好吸申,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般截碴。 火紅的嫁衣襯著肌膚如雪梳侨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天日丹,我揣著相機(jī)與錄音走哺,去河邊找鬼。 笑死哲虾,一個(gè)胖子當(dāng)著我的面吹牛丙躏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播束凑,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晒旅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了汪诉?” 一聲冷哼從身側(cè)響起废恋,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扒寄,沒想到半個(gè)月后鱼鼓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡该编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年迄本,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片课竣。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岸梨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稠氮,到底是詐尸還是另有隱情,我是刑警寧澤半开,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布隔披,位于F島的核電站,受9級(jí)特大地震影響寂拆,放射性物質(zhì)發(fā)生泄漏奢米。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一纠永、第九天 我趴在偏房一處隱蔽的房頂上張望鬓长。 院中可真熱鬧,春花似錦尝江、人聲如沸涉波。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啤覆。三九已至苍日,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窗声,已是汗流浹背相恃。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笨觅,地道東北人拦耐。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像见剩,于是被迫代替她去往敵國和親杀糯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法炮温,類相關(guān)的語法火脉,內(nèi)部類的語法,繼承相關(guān)的語法柒啤,異常的語法倦挂,線程的語...
    子非魚_t_閱讀 31,630評(píng)論 18 399
  • 這是我們?cè)谥袊⒌牡谝粋€(gè)網(wǎng)址。主要用來展示我們的作品担巩。 我們主要專研: 1. 無屏幕方援、無膜、無需VR眼鏡的全息展...
    北極賣火柴閱讀 261評(píng)論 0 0
  • 2月6日涛癌,蘇荷犯戏,22:40-23:40,國學(xué)論語拳话,40-67 要閱讀《人類簡史》先匪,因?yàn)闆]有找到,翻到了上次坐火車要...
    蘇荷annan閱讀 235評(píng)論 0 0
  • 當(dāng)黃蓉幽幽的說她就要嫁給鎮(zhèn)上的鞋匠王麻子時(shí),我正端著茶杯镜盯,一口水直接噴到了坐在對(duì)面的三花身上岸裙。 要嫁那也得嫁給靖哥...
    蜀月秋窗閱讀 751評(píng)論 5 10