前言

目前安卓开发一般都是用的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相关推荐

  1. 最新的ndkr20编译c_史上最优雅的NDK加载pass方案

    关键词: 不需要编译llvm 仅依赖NDK,不需要额外的其他环境 不会遇到配置引起的符号NotFound问题 不污染NDK 一.背景介绍 现在代码保护技术很多是在llvm上实现的,例如 ollvm 和 ...

  2. Android使用Glide加载Gif慢 获取gif时间

    1,解决Glide加载Gif非常慢问题 Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrat ...

  3. activity中fragment 返回键不退出_优雅地处理加载中(loading),重试(retry)和无数据(empty)等...

    LoadSir是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面,可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,占位图,登录失效等常 ...

  4. 优雅处理头像加载失败

    环境: vue2.6.6 element-ui2.13.2 问题: 用户头像图片加载失败,显示异常难看,难看的失败图标. 解决: 使用element-ui的Avatar组件 <template& ...

  5. python爬虫获取的网页数据为什么要加[0-[Python爬虫] 等待网页加载后再获取内容...

    0x0 背景 最近在学习Python爬虫的相关知识,主要是之前有一个小idea想要用Python实现,沉寂了一年,近期终于下定决心要利用假期时间首要解决此项任务,不然拖到最后都没完成,自己遗憾不说,还 ...

  6. DotNetBar 中 SuperGridControl 加载数据、获取数据、设置样式

    1.加载数据 构建列 //加载列GridColumn gd = new GridColumn();gd.Name = "第1";gd.HeaderText = "第1&q ...

  7. 在中WebBrowser加载Excel后获取excel对象

    在最新的Visual Studio 2005中,为我们提供了一个WebBrowser的封装控件,这个控件隐藏了底层的axWebBrowser控件,我们就利用WebBrowser控件来完成我们的Exce ...

  8. JQuery学习之一:(加载函数,获取画面元素,一些简单的函数【each】【find】【focuse】【blur】)

    前言: 最近项目一直很忙,没有时间对工作进行总结: 今天是2013年1月18日 项目UT结束,对项目中的JQUERY知识进行一下总结 1·如何加载JQuery函数. 在使用js时,我们都知道一下这样 ...

  9. iOS 使用NJKWebViewProgress做webview进度条(加载网页时获取加载进度)

    使用到的第三方库:NJKWebViewProgress 使用:采用代理方式,在代理中获取进度,并赋值给进度条.具体看代码. #import "ViewController.h" # ...

最新文章

  1. HashMap内部结构深入剖析
  2. AndroidStudio-引用jar包及so文件
  3. Android的BroadcastReceiver 广播 短信拦截
  4. Codeforces Round #183 (Div. 2)
  5. 收货地址 - 删除收货地址
  6. php执行一条insert插入两条数据其中一条乱码
  7. [html] HTML5如何监听video的全屏和退出全屏?
  8. 猜拳游戏html,JavaScript中实现猜拳小游戏
  9. 卷积神经网络工作原理直观的解释
  10. qt和arcgis for qt在地图上做测距(画线和显示距离,单位km)
  11. java基础——java学习心得
  12. win10上U盘插到电脑上无法显示盘符也打不开怎么办
  13. 红帽linux创建c文件,RedHat成功运行的第一个C程序全过程(适合新手)
  14. 描述性物理海洋学 --第五章学习笔记(大洋中水、盐和热收支以及风应力)
  15. Springboot定时任务【多线程处理】
  16. CTF--web学习
  17. python爬虫项目-优美图库
  18. 名帖30 东汉 隶书《西岳华山庙碑》
  19. 为什么要学习软件质量保证与测试这门课?
  20. python怎么算二元一次方程_用python解决高数所有计算题--sympy求解极限、积分、微分、二元一次方程等...

热门文章

  1. pytorch 笔记:torch.nn.Conv2d
  2. 深度学习核心技术精讲100篇(八十一)-NLP预训练模型ERNIE实战应用案例
  3. 装机人员工具_吕梁采购气伏式包装机-哪家好-强盛包装机械
  4. Jupyterlab 插件安装后侧边栏找不到的解决
  5. 深度学习100例-卷积神经网络(LeNet-5)深度学习里的“Hello Word” | 第22天
  6. 【Python刷题】_8
  7. LeetCode-数组-189. 旋转数组
  8. Cmd Markdown 公式指导手册
  9. lucene源码分析(7)Analyzer分析
  10. Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转