ViewModel优雅的弹加载窗和获取Context
前言
目前安卓开发一般都是用的mvvm模式,Jetpack的ViewModel是必不可少的一部分,而vm的生命周期要比Activity和Fragment长的,所以其一般不推荐其直接持有A或F,因为可能会造成内存泄漏的问题,但是不传入,Context的获取和显示网络加载弹窗又成了问题.
正文
首先解决显示网络加载弹窗的问题,其有两种方案:
1.使用MutableLiveData
首先我们在BaseViewModel中加入弹窗的MutableLiveData
val dialogShow = MutableLiveData(false)
然后我们可以在A或F的onCreate中获取vm的时候注册dialogShow的变化监听
val vm = ViewModelProvider(this).get(BaseViewModel::class.java)vm.dialogShow.observe(this) { isShow ->if (isShow) showWaitDialog() else dismissWaitDialog()}
但是这样写太麻烦了,可以使用Kotlin的代理来简单实现,这样不仅声明的更方便,且自动注册了观察者
inline fun <reified VM : BaseViewModel> BaseActivity.baseViewModel() = lazy {val vm = ViewModelProvider(this).get(VM::class.java)vm.dialogShow.observe(this) { isShow ->if (isShow) showWaitDialog() else dismissWaitDialog()}vm}//Activity中val vm by baseViewModel<BaseViewModel>()
这样的优点很明显,vm完全不用持有A或F,但缺点是无法拿到A的Context
2.将BaseActivity或BaseFragment传入vm
就像AndroidViewModel一样,将A传入vm,但有的小伙伴可能会问了,那内存泄漏了怎么办?办法很简单,等下次重建回来的时候替换掉已经销毁的A即可,实现方式如下(示例为A,F也类似)
open class BaseViewModel(var baseActivity: BaseActivity//内部用于弹窗等的引用
) : ViewModel(){fun getContext() = baseActivityfun showWaitDialog(s: String?) = baseActivity.showWaitDialog(s)fun dismissWaitDialog() = baseActivity.dismissWaitDialog()
}//快捷获取BaseViewModel
inline fun <reified VM : BaseViewModel> BaseActivity.baseViewModel(factory: ViewModelProvider.Factory? = null
) = lazy {val vm = ViewModelProvider(this,factory ?: BaseViewModelFactory(this@baseViewModel)).get(VM::class.java)vm.baseActivity = thisvm
}class BaseViewModelFactory(private val baseActivity: BaseActivity) : ViewModelProvider.Factory {override fun <T : ViewModel?> create(modelClass: Class<T>): T {return modelClass.getConstructor(BaseActivity::class.java).newInstance(baseActivity)}
}//Activity中val vm by baseViewModel<BaseViewModel>()
这样在A的每个对象中第一次使用vm的时候就会把baseActivity替换为自身,也就不存在内存泄漏的问题了
这样就可以愉快的在vm中使用网络加载弹窗和获取Context了
ViewModel优雅的弹加载窗和获取Context相关推荐
- 最新的ndkr20编译c_史上最优雅的NDK加载pass方案
关键词: 不需要编译llvm 仅依赖NDK,不需要额外的其他环境 不会遇到配置引起的符号NotFound问题 不污染NDK 一.背景介绍 现在代码保护技术很多是在llvm上实现的,例如 ollvm 和 ...
- Android使用Glide加载Gif慢 获取gif时间
1,解决Glide加载Gif非常慢问题 Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrat ...
- activity中fragment 返回键不退出_优雅地处理加载中(loading),重试(retry)和无数据(empty)等...
LoadSir是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面,可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,占位图,登录失效等常 ...
- 优雅处理头像加载失败
环境: vue2.6.6 element-ui2.13.2 问题: 用户头像图片加载失败,显示异常难看,难看的失败图标. 解决: 使用element-ui的Avatar组件 <template& ...
- python爬虫获取的网页数据为什么要加[0-[Python爬虫] 等待网页加载后再获取内容...
0x0 背景 最近在学习Python爬虫的相关知识,主要是之前有一个小idea想要用Python实现,沉寂了一年,近期终于下定决心要利用假期时间首要解决此项任务,不然拖到最后都没完成,自己遗憾不说,还 ...
- DotNetBar 中 SuperGridControl 加载数据、获取数据、设置样式
1.加载数据 构建列 //加载列GridColumn gd = new GridColumn();gd.Name = "第1";gd.HeaderText = "第1&q ...
- 在中WebBrowser加载Excel后获取excel对象
在最新的Visual Studio 2005中,为我们提供了一个WebBrowser的封装控件,这个控件隐藏了底层的axWebBrowser控件,我们就利用WebBrowser控件来完成我们的Exce ...
- JQuery学习之一:(加载函数,获取画面元素,一些简单的函数【each】【find】【focuse】【blur】)
前言: 最近项目一直很忙,没有时间对工作进行总结: 今天是2013年1月18日 项目UT结束,对项目中的JQUERY知识进行一下总结 1·如何加载JQuery函数. 在使用js时,我们都知道一下这样 ...
- iOS 使用NJKWebViewProgress做webview进度条(加载网页时获取加载进度)
使用到的第三方库:NJKWebViewProgress 使用:采用代理方式,在代理中获取进度,并赋值给进度条.具体看代码. #import "ViewController.h" # ...
最新文章
- HashMap内部结构深入剖析
- AndroidStudio-引用jar包及so文件
- Android的BroadcastReceiver 广播 短信拦截
- Codeforces Round #183 (Div. 2)
- 收货地址 - 删除收货地址
- php执行一条insert插入两条数据其中一条乱码
- [html] HTML5如何监听video的全屏和退出全屏?
- 猜拳游戏html,JavaScript中实现猜拳小游戏
- 卷积神经网络工作原理直观的解释
- qt和arcgis for qt在地图上做测距(画线和显示距离,单位km)
- java基础——java学习心得
- win10上U盘插到电脑上无法显示盘符也打不开怎么办
- 红帽linux创建c文件,RedHat成功运行的第一个C程序全过程(适合新手)
- 描述性物理海洋学 --第五章学习笔记(大洋中水、盐和热收支以及风应力)
- Springboot定时任务【多线程处理】
- CTF--web学习
- python爬虫项目-优美图库
- 名帖30 东汉 隶书《西岳华山庙碑》
- 为什么要学习软件质量保证与测试这门课?
- python怎么算二元一次方程_用python解决高数所有计算题--sympy求解极限、积分、微分、二元一次方程等...
热门文章
- pytorch 笔记:torch.nn.Conv2d
- 深度学习核心技术精讲100篇(八十一)-NLP预训练模型ERNIE实战应用案例
- 装机人员工具_吕梁采购气伏式包装机-哪家好-强盛包装机械
- Jupyterlab 插件安装后侧边栏找不到的解决
- 深度学习100例-卷积神经网络(LeNet-5)深度学习里的“Hello Word” | 第22天
- 【Python刷题】_8
- LeetCode-数组-189. 旋转数组
- Cmd Markdown 公式指导手册
- lucene源码分析(7)Analyzer分析
- Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转