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

海口网站建设方案优化在线视频播放网站开发

海口网站建设方案优化,在线视频播放网站开发,哈尔滨市人社app,微商城网站建设行情我们一般的,会遇到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/a/506489.html

相关文章:

  • 两江新区建设管理局网站在线logo制作
  • 潍坊网站设计公司如何修改dns 快速使用境外网站
  • 江门营销网站建设铁路网站建设论文
  • 网站开发项目经验描述wang域名建的网站
  • 在线精品课程网站开发关于网站设计的新闻
  • 眉县住房和城市建设局网站注册500万公司实缴多少钱
  • 做游戏网站需要多少钱福州网站设计哪家好
  • 成品短视频网站源码搭建免费公司网站一般去哪里做
  • 什么是网站建设的基础外贸生意做哪个网站好
  • 把两个网站合并到一个网页扬州做企业网站哪家公司好
  • 网站开发专业实习报告各种管理系统
  • 类似于美团的网站怎么做下载别人做的ppt的网站
  • 怎么给购物网站做推广市场推广策略 包括哪些
  • 月付购物网站建站怎样修改公司网站内容
  • 视频素材网站推荐宁波网站建设七米
  • 广州市 网站建设 有限公司最专业的网站建设公司
  • 珠海电商网站建设海口专门做网站
  • 响应式企业网站系统dw网站设计步骤
  • 网站建设三网加工平台设计
  • 北滘网站设计加强网站队伍建设
  • 河北建设厅网站技术电话网站上传的图片怎么做的清晰
  • 合肥培训网站建设网站页面构架
  • 有了域名后怎么完成网站建设不规则网站模板
  • 网站结构分析具体分析内容前端学习网站
  • 网站的展现形式天津网站优化首页
  • 国外营销网站建设那个餐饮网站
  • 昆山便宜做网站副业做网站程序
  • 网站维护工作的基本内容线上广告平台
  • phpmysql网站模板东莞网站制作培训多少钱
  • 二手服务器做网站公司网站建设如何摊销