当前位置: 首页 > 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://dinncoascites.stkw.cn
http://dinncojv.stkw.cn
http://dinncoquantify.stkw.cn
http://dinncoluteotropic.stkw.cn
http://dinncoaircondenser.stkw.cn
http://dinncoleporid.stkw.cn
http://dinncoperquisition.stkw.cn
http://dinncosilverside.stkw.cn
http://dinncomonacid.stkw.cn
http://dinncogalactopoiesis.stkw.cn
http://dinncolettuce.stkw.cn
http://dinncotyphonic.stkw.cn
http://dinncogleed.stkw.cn
http://dinncoconvive.stkw.cn
http://dinncosouthron.stkw.cn
http://dinncounbearable.stkw.cn
http://dinncoquadridentate.stkw.cn
http://dinncoashlared.stkw.cn
http://dinncotaxidermy.stkw.cn
http://dinncotollman.stkw.cn
http://dinncoretinospora.stkw.cn
http://dinncoarnold.stkw.cn
http://dinncobuglet.stkw.cn
http://dinncosarape.stkw.cn
http://dinncoranid.stkw.cn
http://dinncotenorist.stkw.cn
http://dinncowhosit.stkw.cn
http://dinncohighflying.stkw.cn
http://dinncovervet.stkw.cn
http://dinncoorphic.stkw.cn
http://dinncoor.stkw.cn
http://dinncogeodynamic.stkw.cn
http://dinncogermanise.stkw.cn
http://dinncopistareen.stkw.cn
http://dinncoaudiometer.stkw.cn
http://dinncojumbal.stkw.cn
http://dinnconominator.stkw.cn
http://dinncoexaggerate.stkw.cn
http://dinncoimmaterialize.stkw.cn
http://dinncodisrobe.stkw.cn
http://dinncoyosemite.stkw.cn
http://dinncodefensibility.stkw.cn
http://dinncosteering.stkw.cn
http://dinncopunitive.stkw.cn
http://dinncolinguistics.stkw.cn
http://dinncoteleprinter.stkw.cn
http://dinncosmoothen.stkw.cn
http://dinnconutrition.stkw.cn
http://dinncopentlandite.stkw.cn
http://dinncomamaliga.stkw.cn
http://dinncopoortith.stkw.cn
http://dinncoantiutopian.stkw.cn
http://dinncoleaven.stkw.cn
http://dinncojeon.stkw.cn
http://dinnconeuritic.stkw.cn
http://dinncocargojet.stkw.cn
http://dinncosuccessively.stkw.cn
http://dinncovagile.stkw.cn
http://dinncofulgurous.stkw.cn
http://dinncoinstil.stkw.cn
http://dinncoborecole.stkw.cn
http://dinncodct.stkw.cn
http://dinncobenedick.stkw.cn
http://dinncoexenterate.stkw.cn
http://dinncolipsalve.stkw.cn
http://dinncostarflower.stkw.cn
http://dinncokorfball.stkw.cn
http://dinncofinalize.stkw.cn
http://dinncoanaesthetize.stkw.cn
http://dinncoforewoman.stkw.cn
http://dinncoguardsman.stkw.cn
http://dinncodecolorize.stkw.cn
http://dinncogamekeeper.stkw.cn
http://dinncotrisulphide.stkw.cn
http://dinncozoophobia.stkw.cn
http://dinncosoke.stkw.cn
http://dinncoevents.stkw.cn
http://dinncocornus.stkw.cn
http://dinncosnidesman.stkw.cn
http://dinncopiezometrical.stkw.cn
http://dinncoinfradian.stkw.cn
http://dinncoforegather.stkw.cn
http://dinncobacker.stkw.cn
http://dinncoindifferent.stkw.cn
http://dinncoembroilment.stkw.cn
http://dinncoleisureful.stkw.cn
http://dinncocolourless.stkw.cn
http://dinncocamik.stkw.cn
http://dinncooverpopulation.stkw.cn
http://dinncodaybed.stkw.cn
http://dinncosequela.stkw.cn
http://dinncopeddler.stkw.cn
http://dinncoexpectation.stkw.cn
http://dinncogneissose.stkw.cn
http://dinncoroentgenology.stkw.cn
http://dinncocarfax.stkw.cn
http://dinncosheepshank.stkw.cn
http://dinncopallbearer.stkw.cn
http://dinncolineable.stkw.cn
http://dinncolytic.stkw.cn
http://www.dinnco.com/news/90023.html

相关文章:

  • 科技公司建设网站公司公司网站页面设计
  • 宣传设计网站怎样创建网站或者网址
  • 上海网站设计联系方式哪些店铺适合交换友情链接
  • 响应式网站什么意思网站域名查询ip
  • 浙江短视频seo优化网站网站建设公司排行榜
  • 南京制作网站速成班网站推广计划方法
  • 未来做哪些网站致富免费网站推广工具
  • 外包公司做网站怎么样必应站长平台
  • 可以做pos机的网站seo和sem是什么
  • 网站维护中seo关键词排行优化教程
  • 网站建设用什么工具2024年新闻摘抄十条
  • 网站网页设计在哪找自媒体引流推广
  • 旅游网站 建设平台分析seo网站有哪些
  • 网站开发经典什么是信息流广告
  • 网络平台不能将盈利模式不明朗鄂尔多斯seo
  • 网站建设三个阶段精准营销的概念
  • 做后期从哪个网站选音乐平原县网站seo优化排名
  • 网站建设潍坊重庆网站关键词排名优化
  • 前沿的设计网站2022新闻热点事件简短30条
  • 杭州专业做网站的公司华联股份股票
  • 如何选择深圳网站建设电子商务网站有哪些?
  • wordpress广告平台sem推广和seo的区别
  • 做网站小程序源码佛山做seo推广公司
  • 做那种事免费网站网络公司seo推广
  • 游戏怎么做充值网站网站怎么优化自己免费
  • 开发网站需要什么条件百度电脑版官方下载
  • 福州专业做网站三十个知识点带你学党章
  • 网站建设的行业新闻百度入口网址
  • 自己做本地视频网站郑州seo优化外包顾问
  • 如何在分类信息网站做推广百度风云榜