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

专门做高端网站设计的云华设计付费推广有几种方式

专门做高端网站设计的云华设计,付费推广有几种方式,沃尔玛网上超市,华为云助力企业网站安全保障我们一般的,会遇到liveData无法监听到结果,可能存在主要2种可能: liveData没有正确注册;liveData连续多次设置值,中间的值,会被丢弃,但最后一次是能监听到的。 但是我们容易忽略一种case&…

我们一般的,会遇到liveData无法监听到结果,可能存在主要2种可能:

  1. liveData没有正确注册;
  2. liveData连续多次设置值,中间的值,会被丢弃,但最后一次是能监听到的。

但是我们容易忽略一种case,检查你的多线程执行,你的viewModel可能被创建了多次
先说结论:

fun <T> unsafeLazy(initializer: () -> T) = lazy(LazyThreadSafetyMode.NONE, initializer)
//bag: not safe
private val viewModel by unsafeLazy { ViewModelProvider(requireActivity())[MyViewModel::class.java] }
//bag: not safe too
private val viewModel: MyViewModel by activityViewModels()

如上2种都不能在多线程下保险。尤其是官方的by activityViewModels() 容易让你以为它是安全的。但事实上,你的viewModel仍然可能出现问题!

//fragment or activity的onCreateView函数。
//1. 这部分代码原来还隐藏到其他类中。
mFileMgr.loadFileList()//......other....
//2. 初始化监听
viewModel.xxxLiveData.observe(this){ //....
}//FileMgr类
fun loadFileList() {lifecycleScope.launchOnThread { //fragment/activity的scope发起子线程val fileList = viewModel.suspendLoadFileList()lifecycleScope.launch {//do something....}}
}

理解下代码初衷:
我想要异步读取文件列表。写了一个suspend函数LoadFileList在viewModel里面。然后在某个专门处理文件的类里面调用的。
最开始我怀疑我的监听哪里有问题,postValue/setValue存在问题等。
直到梳理代码简化成这样才发现是多线程创建viewModel的问题。

显然,代码是有问题的,先切了子线程,会触达viewModel,同时主线程下面的viewModel.xxxLiveData也会触达。
这样就形成了多线程竞争,同时初始化了2个viewModel,进而导致你监听的liveData已经被别的ViewModel取代。

lazy LazyThreadSafetyMode.NONE可能你能怀疑到,它是一个线程不安全的。
但是,官方库by activityViewModels() 也会出问题,你是没有想到的。

改进

方案1: 使用标准lazy,而不是LazyThreadSafetyMode.NONE

private val viewModel by lazy { ViewModelProvider(requireActivity())[MyViewModel::class.java] }

方案2: lateinit var 在onCreate里面去新建它。稍微比by的方式麻烦,不够简洁。
但是优点很多:
编译后字节码较少:(相较于by懒加载会被创建一些lazy对象,少了不少。)
天然想到最先初始化:类似传统java代码,编码的时候,你肯定想到的在onCreate最前面去创建它,确保了一定初始化和唯一性。
我这里的例子就是我FileMgr类的执行早于主类中触达viewModel 的时机了。导致了问题。

private lateinit var viewModel : MyViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)viewModel = ViewModelProvider(requireActivity())[MyViewModel::class.java]
}

方案3: 不要让子线程更早可能触达viewModel。因为是by懒加载模式,那么,让主线程更早的接触viewModel变量即可。

//先直接主线程触达viewModel
viewModel.xxxLiveData.observe(this){ //....}
mFileMgr.loadFileList()

方案4: 改成viewModel.viewModelScope。这样并不是说因为是scope的原因,是因为触发懒加载。因为函数的调用是主线程,触达viewModel就在主线程了,避免了竞争。

fun loadFileList() {viewModel.viewModelScope.launchOnThread { //fragment/activity的scope发起子线程val fileList = viewModel.suspendLoadFileList()lifecycleScope.launch {//do something....}}
}

总结

对于项目中存在的unsafeLazy的,不仅仅是针对viewModel,
都建议检查你是否有可能多线程竞争问题;
如果,多创建一次对象没啥影响的就无所谓就继续使用。有任何可能,就改成lazy。

对于viewModel的初始化,推荐方案1和方案2。不推荐官方的写法。
如果用官方写法,请自行把握viewModel的触达,确保最早在主线程中被创建。

http://www.dtcms.com/wzjs/606143.html

相关文章:

  • 宜昌做网站的点击下载app安装
  • 教育类手机网站模板网站seo是什么意思
  • 珠海网站优化培训推广方式有哪些?
  • H5响应式网站数据网站开发年终总结
  • 大中型网站开发价格wordpress one touch 下载
  • 凌源网站优化阿里云iot网站开发
  • 青海高端网站建设公司电商网站设计公司
  • 房地产公司的网站建设方案网站建设 jz.woonl
  • 推广系统建站wordpress mysql 密码重置
  • 河北省建设项目环保备案网站山东大良网站建设
  • 手机网站模版下载安徽省住房建设厅网站
  • 手机网站建设进度成都网站网络建设
  • 网站建设捌金手指下拉二八网站如何更新内容
  • 手机能看禁止网站的浏览器营销型网站有什么特点
  • 使用vue路由做网站是什么网站建设
  • 怎样做电商网站好视频教学异度空间主题 wordpress
  • 零用贷网站如何做seo关键词优化培训
  • 做自适应网站对设计稿的要求软文平台有哪些
  • 中山市两学一做网站凡客旗下商城
  • 网站快照诊断网络营销与策划实务
  • 晋江哪里可以学建设网站企业管理生产管理系统
  • 做网站付款方式建设厅网站
  • 外贸营销网站建设工程wordpress 有赞
  • 网站备案 法人漳州网站建设优化推广
  • 做网站首页需要什么资料怎么做网站公司宣传资料
  • 承包网站开发dede网站后台
  • 作文网投稿网站重庆网站制作外包
  • 宁波企业建网站报价wordpress 定宽
  • 网站收录很慢房产中介
  • 成都有哪些比较做网站比较好的校园门户网站建设实施方案