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

制作商城版网站开发企业网络营销案例

制作商城版网站开发,企业网络营销案例,工业信息化部网站备案,做汽车团购网站前言 viewmodel是jetpack中比较重要的一个组件。如果还没有学习viewmodel不知道怎么写代码什么的,可以看一下我之前写得文章。 jetpack之ViewModel的简单使用https://blog.csdn.net/i_xiang_la_shi/article/details/147218033?fromshareblogdetail&sharetype…

前言

viewmodel是jetpack中比较重要的一个组件。如果还没有学习viewmodel不知道怎么写代码什么的,可以看一下我之前写得文章。

jetpack之ViewModel的简单使用https://blog.csdn.net/i_xiang_la_shi/article/details/147218033?fromshare=blogdetail&sharetype=blogdetail&sharerId=147218033&sharerefer=PC&sharesource=i_xiang_la_shi&sharefrom=from_link那么,学习了viewmodel的基础,有女朋友的朋友就可以说——我虽然像activity一般变化莫测,但我对你的爱如ViewModel矢志不渝!!(❁´◡`❁)

 那么在之前的lifecycle原理解析中我把lifecycle的实现分成几个核心组件去讲解,如果对lifecycle不太理解的可以去看。

jetpack之lifecycle的原理分析https://blog.csdn.net/i_xiang_la_shi/article/details/147191937?fromshare=blogdetail&sharetype=blogdetail&sharerId=147191937&sharerefer=PC&sharesource=i_xiang_la_shi&sharefrom=from_link那么在viewmodel的原理中,我也会将viewmodel的实现分成几个核心组件去讲解。

核心组件

VIewModelStore——数据托管商店

在分析lifecycle的时候,细心的朋友可能就注意到了——Fragment实现了一个接口:ViewModelStoreOwner。如下图所示:

 顺着这条线索摸下去,是不是Fragment本身就存在一个ViewModelSotre呢?

    @NonNull@Overridepublic ViewModelStore getViewModelStore() {if (mFragmentManager == null) {throw new IllegalStateException("Can't access 
ViewModels from detached fragment");}if (getMinimumMaxLifecycleState() == Lifecycle.State.INITIALIZED.ordinal()) {throw new IllegalStateException("Calling getViewModelStore() before a Fragment "+ "reaches onCreate() when using setMaxLifecycle(INITIALIZED) is not "+ "supported");}return mFragmentManager.getViewModelStore(this);}

我们发现在源码中真的说明了,Fragment拥有一个ViewModelStore。那么他有什么用呢?


作用:

  • 管理ViewModel实例
  • 与Activity/Fragment的生命周期解耦,即便是屏幕翻转,ViewModelStore依然存在。
  • 感知Ui组件的销毁

销毁时机​​:当 UI 控制器因非配置更改(如用户主动退出)被销毁时,ViewModelStore 调用 clear() 释放所有 ViewModel 实例 

ViewModel是通过一个方法进行ViewModel实例的清理的——onCleared()。

VIewModelStore通过与lfecycle进行绑定,优雅的解决了内存泄漏的难题。


我们看以下代码就能够知道ViewModelStore为什么能够在屏幕翻转的时候依然存在了:

这里我就截图了,我们可以清晰的看到,标黄的方法是在ComponentActivity的构造方法中的。根据方法名称我们就能猜到,这是保活ViewModelStore用的。只要商店没倒闭、没关门,那么我托管的数据当然会一直存在那里了。😋

ViewModelProvider——ViewModel的生产车间

在ViewModel基础中,我们说明了——不通过ViewModel直接创建实例,而是通过ViewModelProvider。

作用:

  • 通过反射创建ViewModel

  • 共享实例保证数据一致性

public interface Factory {/*** Creates a new instance of the given `Class`.** Default implementation throws [UnsupportedOperationException].** @param modelClass a `Class` whose instance is requested* @return a newly created ViewModel*/public fun <T : ViewModel> create(modelClass: Class<T>): T {throw UnsupportedOperationException("Factory.create(String) is unsupported.  This Factory requires " +"`CreationExtras` to be passed into `create` method.")}/*** Creates a new instance of the given `Class`.** @param modelClass a `Class` whose instance is requested* @param extras an additional information for this creation request* @return a newly created ViewModel*/public fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T =create(modelClass)companion object {/*** Creates an [InitializerViewModelFactory] using the given initializers.** @param initializers the class initializer pairs used for the factory to create* simple view models*/@JvmStaticfun from(vararg initializers: ViewModelInitializer<*>): Factory =InitializerViewModelFactory(*initializers)}
}

 在源码中我们可以看到,它是通过工厂模式和反射机制进行了ViewModel的创建,这就让数据不管在哪里都能保存一致,它的生命周期也不受UI组件的控制。

public constructor(owner: ViewModelStoreOwner) : this(owner.viewModelStore, defaultFactory(owner), defaultCreationExtras(owner))

 这是一个我们熟悉的构造函数,我们发现,这里的owner不是lifecycOwner而是ViewModelOwner,这就说明你的数据能够流通的范围是和owner有关的。如果两个Fragment都绑定了他们各自的activity并且他们两个activity都是一样的,那么就实现了fragment的数据传输。

那么get方法又是怎么回事?

 

@MainThreadpublic open operator fun <T : ViewModel> get(modelClass: Class<T>): T {val canonicalName = modelClass.canonicalName?: throw IllegalArgumentException("Local and anonymous classes can not be ViewModels")return get("$DEFAULT_KEY:$canonicalName", modelClass)}

源码中可以发现,他是对一个get函数的包装,我们在进去看:

@Suppress("UNCHECKED_CAST")@MainThreadpublic open operator fun <T : ViewModel> get(key: String, modelClass: Class<T>): T {val viewModel = store[key]if (modelClass.isInstance(viewModel)) {(factory as? OnRequeryFactory)?.onRequery(viewModel!!)return viewModel as T} else {@Suppress("ControlFlowWithEmptyBody")if (viewModel != null) {// TODO: log a warning.}}val extras = MutableCreationExtras(defaultCreationExtras)extras[VIEW_MODEL_KEY] = key// AGP has some desugaring issues associated with compileOnly dependencies so we need to// fall back to the other create method to keep from crashing.return try {factory.create(modelClass, extras)} catch (e: AbstractMethodError) {factory.create(modelClass)}.also { store.put(key, it) }}

我们可以看到此函数第一开始是希望先去ViewModelStore中去寻找有没有这个实例,然后如果能够找到就直接返回了,没有找到就使用我们上面提到的工厂模式去创建。

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

相关文章:

  • 浙江省建设厅干部学校网站社群推广平台
  • 推荐大良营销网站建设优化公司哪家好
  • 海阳做网站天津seo排名
  • 站长之家端口扫描潍坊网站开发公司
  • wordpress导入xls厦门seo排名优化
  • 音响网站模板百度一下你就知道手机版官网
  • 铜仁北京网站建设百度竞价排名是哪种方式
  • 长春专业企业网站建设价格电商运营培训班多少钱
  • 免费网站申请注册步骤在线制作网页网站
  • 苏州微网站建设公司营销企业
  • 网站做端口是什么西安 做网站
  • 一个很好的个人网站开发手机流畅优化软件
  • 真如做网站手机推广app
  • 做网站用java还是c语言宁海关键词优化怎么优化
  • 越城区建设和交通运输局网站网络培训机构排名前十
  • dw中做网站的步骤系统优化大师下载
  • 淘宝的网站建设优化营商环境工作总结
  • 便宜电商网站建设ip或域名查询网
  • 高端建站骗局怎么做网站优化
  • 网站的登陆页怎么做图片如何加入百度推广
  • 常用的网站推广的方式方法搜索图片
  • wordpress 帝国备份宁波seo公司
  • 毕业设计网站建设题目怎么做一个网站页面
  • 那个网站教人做冰点百度今日小说搜索风云榜
  • 做淘客网站去哪里购买空间网站在线生成app
  • 网站怎么做的有创意开封seo推广
  • 淘宝做任务网站郑州厉害的seo顾问
  • 网站开发前端后端巩义网站推广优化
  • 深圳p2p网站开发百度网站快速优化
  • 西安网站建设熊掌号百度关键词排名销售