ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DataStore ,含BATJM大厂

2021-09-08 09:34:48  阅读:185  来源: 互联网

标签:produceFile val scratchFile BATJM 大厂 file DataStore TODO 151635324


interface Serializer {

fun readFrom(input: InputStream): T

fun writeTo(t: T, output: OutputStream)

val defaultValue: T
    }

// TODO(b/151635324): Add initializers.
    // TODO(b/151635324): Add exception handlers.
    // TODO(b/151635324): Consider adding snapshot API.
}

`


没错,是基于 **协程** 和 **Flow** 实现的。

*   `dataFlow` 是一个 Flow 对象
*   `updateData()` 用于更新对象
*   `Serializer` 接口,提供序列化和持久化能力

目前源码中仅仅提供了一个实现类:**SingleProcessDataStore** 。从名字就可以看出来,不支持多进程。看一下其中几个关键方法。

class SingleProcessDataStore<T>(     private val produceFile: () -> File,     private val serializer: DataStore.Serializer<T>,     private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) ) : DataStore<T> {     ......     private suspend fun readData(): T {         // TODO(b/151635324): consider caching produceFile result.         val file = produceFile()         try {             FileInputStream(file).use { stream ->                 return serializer.readFrom(stream)             }         } catch (ex: FileNotFoundException) {             if (file.exists()) {                 throw ex             }             return serializer.defaultValue         }     }          private fun writeData(newData: T) {         // TODO(b/151635324): consider caching produceFile result.         val file = produceFile()         file.mkdirs()         val scratchFile = File(file.absolutePath + SCRATCH_SUFFIX)         try {             FileOutputStream(scratchFile).use { stream ->                 serializer.writeTo(newData, stream)                 stream.fd.sync()                 // TODO(b/151635324): fsync the directory, otherwise a badly timed crash could                 //  result in reverting to a przuihouevious state.             }             scratchFile.renameTo(file)         } catch (ex: IOException) {             if (scratchFile.exists()) {                 scratchFile.delete()             }             throw ex         }     }     ...... }


`readData()` 和 `writeData()` 实际都是在读写文件。

具体用法详见官方写的单元测试 **SingleProcessDataStoreTest**,地址如下:

https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:datastore/datastore-core/src/test/kotlin/androidx/datastore/SingleProcessDataStoreTest.kt

最后
--

到目前为止,DataStore 仍在开发中,并没有发布过任何可用的版本 ,现在并不足以替代 SharedPreferences 。按 Google 的尿性,哪天流产了其实也不足为奇。你可以在 androidx-master-dev 中持续关注。

不过两个问题是可以确定的。

第一,Google 自己也快看不下去 SharedPreferences 了。

第二,越来越多的新特性都是基于 Kotlin 实现的了,甚至只对 Kotlin 提供支持,大有 Kotlin First 到 Kotlin Only 的趋势。

所以,还没有学习 Kotlin 的同学们,抓紧上车吧!

* * *

 

标签:produceFile,val,scratchFile,BATJM,大厂,file,DataStore,TODO,151635324
来源: https://blog.csdn.net/yandex666/article/details/120172119

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有