偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

告別SharedPreferences!用DataStore打造更靠譜的本地存儲(chǔ)

存儲(chǔ) 存儲(chǔ)架構(gòu)
升級(jí)到DataStore?后,你會(huì)發(fā)現(xiàn)代碼里少了無(wú)數(shù)個(gè)getSharedPreferences()?,再也不用寫(xiě)commit()和apply()?的糾結(jié)選擇,數(shù)據(jù)操作就像用LiveData一樣流暢自然。

DataStore作為Android官方推薦的新一代數(shù)據(jù)存儲(chǔ)方案,完美解決了SharedPreferences的三大痛點(diǎn):

1. 主線程卡頓終結(jié)者
所有讀寫(xiě)操作自動(dòng)切到子線程,再也不用擔(dān)心用戶(hù)點(diǎn)按鈕時(shí)卡住界面。對(duì)比之下SharedPreferencescommit()方法就像在早高峰的主干道上調(diào)頭。

2. 類(lèi)型安全不翻車(chē)
ProtoDataStore可以像寫(xiě)類(lèi)一樣定義數(shù)據(jù)結(jié)構(gòu),徹底告別SharedPreferences里把字符串當(dāng)數(shù)字用的尷尬場(chǎng)景。

3. 數(shù)據(jù)保險(xiǎn)箱機(jī)制
自帶"原子操作"屬性,就算突然斷電也不會(huì)出現(xiàn)存了一半的殘缺數(shù)據(jù)。這就像銀行轉(zhuǎn)賬,要么成功要么失敗,絕不會(huì)有中間狀態(tài)。

手把手教你兩種用法

簡(jiǎn)單配置存儲(chǔ)(Preferences版)

適用場(chǎng)景:比如記住用戶(hù)設(shè)置的夜間模式、字體大小等簡(jiǎn)單配置

// 第一步:在build.gradle添加
dependencies {
    implementation 'androidx.datastore:datastore-preferences:1.1.1'
}

// 第二步:創(chuàng)建存儲(chǔ)文件(放在Application類(lèi)里)
val Context.appSettings by preferencesDataStore(name = "user_prefs")

// 第三步:定義要存的字段
object PrefsKeys {
    val DARK_MODE = booleanPreferencesKey("dark_mode")
    val FONT_SIZE = intPreferencesKey("font_size")
}

// 第四步:讀寫(xiě)操作
classSettingsRepository(privateval context: Context) {
    // 讀取設(shè)置
    val darkModeFlow: Flow<Boolean> = context.appSettings.data
        .map { prefs -> prefs[PrefsKeys.DARK_MODE] ?: false }

    // 修改設(shè)置
    suspendfun toggleDarkMode(enable: Boolean) {
        context.appSettings.edit { settings ->
            settings[PrefsKeys.DARK_MODE] = enable
        }
    }
}

復(fù)雜數(shù)據(jù)存儲(chǔ)(Proto版)

適用場(chǎng)景:存儲(chǔ)用戶(hù)游戲存檔、購(gòu)物車(chē)信息等結(jié)構(gòu)化數(shù)據(jù)

// 第一步:定義proto結(jié)構(gòu)(新建settings.proto文件)
syntax = "proto3";

message GameSave {
    int32 current_level = 1;
    repeated string unlocked_items = 2;
    map<string, int32> equipment_stats = 3;
}

// 第二步:生成Java類(lèi)(Build -> Rebuild Project)

// 第三步:實(shí)現(xiàn)序列化器
object GameSaveSerializer : Serializer<GameSave> {
    overrideval defaultValue = GameSave.getDefaultInstance()
    
    overridesuspendfun readFrom(input: InputStream) = 
        try { GameSave.parseFrom(input) } 
        catch (e: Exception) { throw CorruptionException("存檔損壞", e) }

    overridesuspendfun writeTo(data: GameSave, output: OutputStream) = 
        data.writeTo(output)
}

// 第四步:創(chuàng)建DataStore實(shí)例
val Context.gameData by dataStore("game_saves.pb", GameSaveSerializer)

// 第五步:操作游戲存檔
classGameSaveManager(privateval context: Context) {
    // 讀取關(guān)卡進(jìn)度
    val currentLevelFlow: Flow<Int> = 
        context.gameData.data.map { it.currentLevel }

    // 解鎖新道具
    suspendfun unlockItem(itemName: String) {
        context.gameData.updateData { current ->
            current.toBuilder()
                .addUnlockedItems(itemName)
                .build()
        }
    }
}

開(kāi)發(fā)避坑指南

1.單例原則
每個(gè)存儲(chǔ)文件只能創(chuàng)建一個(gè)DataStore實(shí)例,建議在Application類(lèi)初始化

2.遷移老數(shù)據(jù)
dataStore.migrateFrom(sharedPrefs)一鍵遷移,記得先停用舊的SharedPreferences

3.多進(jìn)程場(chǎng)景
用這個(gè)特殊創(chuàng)建方式保證數(shù)據(jù)安全:

val multiProcessStore = MultiProcessDataStoreFactory.create(
    serializer = GameSaveSerializer(),
    produceFile = { File(context.filesDir, "multi_process_data.pb") }
)

4.異常處理
Flow收集時(shí)加上catch處理:

context.gameData.data
    .catch { ex -> 
        if (ex is CorruptionException) recoverFromCorruption()
    }
    .collect { gameSave -> updateUI(gameSave) }

什么時(shí)候該用DataStore?

  • 需要存用戶(hù)個(gè)性化設(shè)置
  • 需要緩存接口返回的簡(jiǎn)單數(shù)據(jù)
  • 需要保存應(yīng)用狀態(tài)(比如表單草稿)
  • 需要跨進(jìn)程共享數(shù)據(jù)

?? 需要存大量結(jié)構(gòu)化數(shù)據(jù) → 考慮Room數(shù)據(jù)庫(kù)
?? 需要存圖片/視頻 → 直接用文件存儲(chǔ)

升級(jí)到DataStore后,你會(huì)發(fā)現(xiàn)代碼里少了無(wú)數(shù)個(gè)getSharedPreferences(),再也不用寫(xiě)commit()和apply()的糾結(jié)選擇,數(shù)據(jù)操作就像用LiveData一樣流暢自然。

責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛碟
相關(guān)推薦

2013-01-18 10:16:42

2015-11-09 16:45:14

尼泊爾地震

2015-07-23 14:25:04

宕機(jī)云主機(jī)云智慧

2016-09-18 10:51:01

JavascriptHtml5移動(dòng)應(yīng)用

2018-06-01 16:06:29

PR靠譜Code Review

2012-10-22 11:14:05

SDNOpenFlow網(wǎng)絡(luò)管理

2015-06-23 10:07:31

密碼表情密碼

2020-12-22 06:18:47

Windows 10Windows操作系統(tǒng)

2025-06-10 08:30:50

2018-01-25 16:00:31

2019-06-28 15:54:49

大數(shù)據(jù)

2014-07-29 09:33:17

公司郵箱

2016-04-08 15:04:37

人工智能阿里小Ai

2015-07-29 20:24:03

聯(lián)盟

2014-02-19 10:49:55

Windows 9

2011-12-22 09:32:34

虛擬化桌面虛擬化云計(jì)算

2023-07-25 13:10:54

大模型文心大模型百度

2014-10-21 10:29:54

TIOBEPyPI

2017-09-05 14:23:22

人工智能機(jī)器翻譯神經(jīng)網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)