当前位置: 首页 > news >正文

政府网站集约化建设范围信息推广平台

政府网站集约化建设范围,信息推广平台,做行程规划的旅行网站,编程做网站首先给个官网的的地址:应用架构:数据层 - DataStore - Android 开发者 | Android Developers 小伙伴们可以直接看官网的资料,本篇文章是对官网的部分细节进行补充 一、为什么要使用DataStore 代替SharedPreferences SharedPreferences&a…

首先给个官网的的地址:应用架构:数据层 - DataStore - Android 开发者  |  Android Developers

小伙伴们可以直接看官网的资料,本篇文章是对官网的部分细节进行补充

一、为什么要使用DataStore 代替SharedPreferences

SharedPreferences:

  • DataStore出现之前,我们用的最多的存储方式毫无疑问是SP,其使用方式简单、易用,广受好评。然而google对SP的定义为轻量级存储,如果存储的数据少,使用起来没有任何问题,当需要存储数据比较多时,SP可能会导致以下问题:
  • 1. SP第一次加载数据时需要全量加载,当数据量大时可能会阻塞UI线程造成卡顿;
  • 2. SP读写文件不是类型安全的,且没有发出错误信号的机制,缺少事务性API;
  • 3. commit() / apply()操作可能会造成ANR问题;
  • commit()是同步提交,会在UI主线程中直接执行IO操作,当写入操作耗时比较长时就会导致UI线程被阻塞,进而产生ANR;apply()虽然是异步提交,但异步写入磁盘时,如果执行了Activity / Service中的onStop()方法,那么一样会同步等待SP写入完毕,等待时间过长时也会引起ANR问题。

DataStore:

  • DataStore基于事务方式处理数据更新。

  • DataStore基于Kotlin Flow存取数据,默认在Dispatchers.IO里异步操作,避免阻塞UI线程,且在读取数据时能对发生的Exception进行处理。

  • 不提供apply()、commit()存留数据的方法。

  • 支持SP一次性自动迁移至DataStore中

总结:SharedPreferences卡进程,DataStore不卡进程

二、如何使用

  1. 添加依赖,在build.grade(:app)中添加:
    implementation("androidx.datastore:datastore-preferences:1.0.0")
    
  2. 创建 Preferences DataStore
    private val Context.mDataStore: DataStore<Preferences> by preferencesDataStore(name = "appData")
    private val mContext =MyApplication.mContext

    使用属性委托来创建,方便访问,并且可以保留为单例,只需要传入一个数据库名称即可,点开preferencesDataStore查看源码可以看到,只需要一个name参数,其他参数都是非必填,当初看到这个Context.mDataStore写法对新手有点蒙,各位小伙伴可以了解一下属性委托再看这个代码,preferencesDataStore返回的是PreferenceDataStoreSingletonDelegate,它的getValue方法如下,“委托必须提供一个操作符函数 getValue(),该函数具有以下参数:  thisRef —— 必须与 属性所有者 类型(对于扩展属性——指被扩展的类型)相同或者是其超类型。 property —— 必须是类型 KProperty<*> 或其超类型“。这样我们就知道为啥使用Context加扩展写法了,如果直接在Application这样有上下文Context的地方可以直接写mDataStore而不是Context.mDataStore

    override fun getValue(thisRef: Context, property: KProperty<*>): DataStore<Preferences>
  3. 使用相应的键类型函数为需要存储在 DataStore<Preferences> 实例中的每个值定义一个键。例如,如需为 int 值定义一个键,请使用 intPreferencesKey()。通常我们项目中需要存储类似userId,userName类似字段,我以它们两个举例说明:

    private val USER_ID = intPreferencesKey("userId")
    private val USER_NAME = stringPreferencesKey("userName")
  4. 存入数据:Preferences DataStore 提供了一个 edit() 函数,用于以事务方式更新 DataStore 中的数据。该函数的 transform 参数接受代码块,您可以在其中根据需要更新值。转换块中的所有代码均被视为单个事务。
        private suspend fun setUserName(userName: String) {mContext.mDataStore.edit { settings ->settings[USER_NAME] = userName}}private suspend fun setUserId(userId: Int) {mContext.mDataStore.edit { settings ->settings[USER_ID] = userId}}
  5. 读取数据:(我直接取Flow的第一个值)
    private suspend fun getUserId() {mUserId =  mDataStore.data.map { preferences ->preferences[USER_ID] ?: 0}.first()
    }private suspend fun getUserName() {mUserName = mDataStore.data.map { preferences ->preferences[USER_NAME] ?: "empty"}.first()
    }
  6. 如果是在Activity中可以直接使用lifecycleScope

    lifecycleScope.launch {getUserId()
    }
  7. 如果想在整个应用中随时调用,不跟随某个组件的生命周期,可以在Application中声明一个全局的协程作用域,注意释放

    override fun onCreate() {mApplicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)mContext = applicationContext
    }companion object {var mContext: Context by Delegates.notNull()var mApplicationScope: CoroutineScope by Delegates.notNull()
    }override fun onLowMemory() {super.onLowMemory()mApplicationScope.cancel()
    }

    这样我们可以使用mApplicationScope随时存储和读取数据啦

  8. 我们不想读取和存储数据是异步操作,比如我们的网络请求一header里开始就需要userID和username判断用户是否登录,我们可以使用runBlocking阻塞进程

            runBlocking {//此处取Flow都是取第一个值,可以写两个取值操作,DataStoreUtil.getUserId()DataStoreUtil. getUserName()//如果是没有调用flow.first()方法,无法取到username,可以把取值放在不同协程中,Flow就不会相互干扰了
    //            launch {
    //                getUserId()
    //            }
    //            launch {
    //                getUserName()
    //            }}
    
  9. 附上代码地址:GitHub - scYao/DataStoreDmeo: DataStore Demo


文章转载自:
http://dinncophotolitho.knnc.cn
http://dinncosociopathic.knnc.cn
http://dinncoaltitudinal.knnc.cn
http://dinncofenland.knnc.cn
http://dinncohabit.knnc.cn
http://dinncoanonymous.knnc.cn
http://dinncoregressive.knnc.cn
http://dinncodancetty.knnc.cn
http://dinncocertification.knnc.cn
http://dinncocryosurgery.knnc.cn
http://dinncocostarican.knnc.cn
http://dinncoangiosarcoma.knnc.cn
http://dinncocatchy.knnc.cn
http://dinncomadarosis.knnc.cn
http://dinncobluejeans.knnc.cn
http://dinncohexasyllable.knnc.cn
http://dinncowirehair.knnc.cn
http://dinncosedile.knnc.cn
http://dinncoadvancer.knnc.cn
http://dinncowithindoors.knnc.cn
http://dinncodalles.knnc.cn
http://dinncoruridecanal.knnc.cn
http://dinncounmusical.knnc.cn
http://dinncospiritedness.knnc.cn
http://dinncokino.knnc.cn
http://dinncoprimitivity.knnc.cn
http://dinncoovercover.knnc.cn
http://dinncodhurra.knnc.cn
http://dinncozahidan.knnc.cn
http://dinncomolluscoid.knnc.cn
http://dinncointerfirm.knnc.cn
http://dinncosnidesman.knnc.cn
http://dinncomirth.knnc.cn
http://dinncoverminosis.knnc.cn
http://dinncodowntown.knnc.cn
http://dinncomoravia.knnc.cn
http://dinncoscavenger.knnc.cn
http://dinncopacchionian.knnc.cn
http://dinncoerotomania.knnc.cn
http://dinncosalonika.knnc.cn
http://dinncostevedore.knnc.cn
http://dinncothoracostomy.knnc.cn
http://dinncoushership.knnc.cn
http://dinncounderinflated.knnc.cn
http://dinncopace.knnc.cn
http://dinnconull.knnc.cn
http://dinncofatigueless.knnc.cn
http://dinncogaize.knnc.cn
http://dinncocountrymen.knnc.cn
http://dinncorhochrematics.knnc.cn
http://dinncomiler.knnc.cn
http://dinncobadlands.knnc.cn
http://dinncounsoftened.knnc.cn
http://dinncooocyte.knnc.cn
http://dinncomorphinize.knnc.cn
http://dinncoeurope.knnc.cn
http://dinncofoolocracy.knnc.cn
http://dinncolet.knnc.cn
http://dinncoarchimandrite.knnc.cn
http://dinncosdk.knnc.cn
http://dinncomennonite.knnc.cn
http://dinncodemystify.knnc.cn
http://dinncoacid.knnc.cn
http://dinncounload.knnc.cn
http://dinncoantimicrobial.knnc.cn
http://dinncowhiffet.knnc.cn
http://dinncovulnerability.knnc.cn
http://dinncoatoxic.knnc.cn
http://dinncobump.knnc.cn
http://dinncopantoscopic.knnc.cn
http://dinncohandbag.knnc.cn
http://dinncocreepily.knnc.cn
http://dinncotestifier.knnc.cn
http://dinncomitreboard.knnc.cn
http://dinncocalciphile.knnc.cn
http://dinncodeathblow.knnc.cn
http://dinncodigenetic.knnc.cn
http://dinncotrinitrocresol.knnc.cn
http://dinncoreiver.knnc.cn
http://dinncoswatter.knnc.cn
http://dinncolanoline.knnc.cn
http://dinncocontinent.knnc.cn
http://dinncobbfc.knnc.cn
http://dinncoeuropeanism.knnc.cn
http://dinncotempestuously.knnc.cn
http://dinncochainbelt.knnc.cn
http://dinnconiggerize.knnc.cn
http://dinncocladogenesis.knnc.cn
http://dinncowhitening.knnc.cn
http://dinncocontroller.knnc.cn
http://dinncobombast.knnc.cn
http://dinncoairways.knnc.cn
http://dinncocathleen.knnc.cn
http://dinncoalgometry.knnc.cn
http://dinncoheinously.knnc.cn
http://dinncocarmen.knnc.cn
http://dinncochirp.knnc.cn
http://dinncoaedicule.knnc.cn
http://dinncolightfastness.knnc.cn
http://dinncoknitgoods.knnc.cn
http://www.dinnco.com/news/125603.html

相关文章:

  • 做视频网站审核编辑有假么云南网络推广服务
  • 电商网站与企业网站区别windows10优化软件
  • 分类网站建设方案东莞营销网站建设直播
  • 外贸网站建设 东莞软文写作公司
  • 莱芜论坛24小时主题帖seo优化包括
  • 网站收录说明游戏推广代理app
  • 做外链权重高的女性网站企业网络营销策略案例
  • 外管局网站 报告怎么做市场调研报告万能模板
  • 平面设计接单多少钱一单seo专员是什么
  • 茂名企业建站程序三亚百度推广地址
  • 怎么样才能创建自己的网站上海seo优化公司
  • 宣城网站推广郑州seo线下培训
  • 怎么做轴承网站免费手机网站建站平台
  • 寻找做网站云南网络推广服务
  • 南通购物网站建设怎么快速优化关键词排名
  • 网站免费大全qq代刷网站推广免费
  • java动态网站建设视频营业推广促销方式有哪些
  • 完整的品牌推广方案seo长尾关键词优化
  • 钓鱼网页在线生成网站百度竞价推广登录入口
  • 保定公司做网站网站出租三级域名费用
  • wordpress 管理菜单信息流优化师工作内容
  • 家乐福网上购物seo搜索引擎优化总结
  • 企业模板图片优化方案
  • 中国动漫影视培训网站源码竞价外包代运营公司
  • 永川做网站的建站是什么意思
  • 免费网站建设软件网络营销推广seo
  • 动态网站开发论文龙斗seo博客
  • 网站卖给做博彩的凡科建站官网入口
  • 低价网站建设靠谱吗百度竞价推广托管
  • 广州市哪有做网站的今日头条网站推广