Android开发之MVVM模式实践(六),2021字节跳动春招技术面试题
以上是我们创建协程的实现方式,我们可以通过指定Dispatchers
来决定协程到底在什么线程中工作,而其实Kotlin的协程核心库中也为我们提供封装好了的scope
,例如MainScope
,源码如下:
@Suppress(“FunctionName”)
public fun MainScope(): CoroutineScope = ContextScope(SupervisorJob() + Dispatchers.Main)
非常明显,Kotlin提供的MainScope
内部实现与我们自行创建的CoroutineScope
一模一样,MainScope
在一定程度上方便了我们创建协程。
lifecycle-viewmodel-ktx
知晓协程如何创建后,我们需要思考一个问题:协程主要的使用层是MVVM的哪一层?因为协程最主要的作用是用同步编码的方式来实现异步;既然有异步,那么直接操作UI的View层明显是不太适合使用协程的,剩下的ViewModel与Model层则都很适合添加协程封装。我们先从ViewModel开始添加协程,幸运的是Google已经考虑到了这一层,并为我们提供了相关依赖,导入方式如下:
implementation ‘androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0’
在导入此依赖后,会为ViewModel
添加一个名为viewModelScope
的扩展函数,此函数会创建一个做了优化的协程,源码如下:
val ViewModel.viewModelScope: CoroutineScope
get() {
val scope: CoroutineScope? = this.getTag(JOB_KEY)
if (scope != null) {
return scope
}
return setTagIfAbsent(JOB_KEY,
CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main.immediate))
}
拿到viewModelScope
后,我们就可以在BaseViewModel
添加如下代码:
abstract class BaseViewModel : ViewModel(), ViewModelLifecycle, ViewBehavior {
/**
- 在主线程中执行一个协程
*/
protected fun launchOnUI(block: suspend CoroutineScope.() -> Unit): Job {
return viewModelScope.launch(Dispatchers.Main) { block() }
}
/**
- 在IO线程中执行一个协程
*/
protected fun launchOnIO(block: suspend CoroutineScope.() -> Unit): Job {
return viewModelScope.launch(Dispatchers.IO) { block() }
}
}
二、与Retrofit的结合
目前在Android开发中,最主流的网络请求框架应该就是Retrofit+OkHttp+RxJava
这一套了。那么下面我们就使用Retrofit
来结合协程进行封装。在网络请求中,协程起的作用其实与RxJava
是一致的,所以如果在别处没有使用RxJava
的需求,此处可以不引入RxJava
,只需引入Retrofit+OkHttp
。
Interface
interface FlyInterface {
/**
- 获取文章列表
*/
@GET(“article/”)
suspend fun get_article_list(@Query(“page_size”) size: Int): ApiResponse<CommonListDto>
}
http://www.taodudu.cc/news/show-3513161.html相关文章:
- 智能门锁生成临时密码不需要联网实现原理
- 智算新时代,浪潮云海云图生态3.0打开千亿智慧生态市场
- Android开发之MVVM模式实践(六)
- Android开发之MVVM模式实践(六),太现实了
- IO分支 各种高效流和序列化的详解
- Android开发之MVVM模式实践:协程与网络请求的结合
- C语言k=xm gt xn gt p,C语言学习001:让程序跑起来
- 两部委发文鼓励开源,从业者:没有开源就没有区块链,更没有核心创新力
- 荐读 | 数据共享与隐私矛盾:技术未满,向现实妥协
- python前两周练习
- 陆游之清商怨
- 秋招_多益网络_一面/HR面
- 扩散(蓝桥杯真题)——python解答
- 20155224 聂小益 《基于Arm实验箱的接口测试和应用》 课程设计报告
- 20155224聂小益 2016-2017-2 《Java程序设计》第1周学习总结
- Vue 自提项目 --小益回收 遇到的问题(一)
- 20155224聂小益的Linux学习
- Vue 自提项目 --小益回收 遇到的问题(二)
- 精灵混合加密系统_多种解锁体验,小益天猫精灵智能指纹锁E206T
- 20155224聂小益 - 我的技能与C语言学习
- 搭载清微智能TX510,小益T8等新品强势亮相建博会 “真智能锁”火爆出圈!
- OpenFOAM reconstructPar指定时刻或时间段
- Oracle查询一段时间内的数据
- MySql根据时间查询数据
- 关于这段时间翻译的一点感悟
- mysql 获取某个时间段每一天的统计数据
- Unity 实现每隔一段时间重复执行
- 将时间段转化为48位二进制编码
- 英语阶段总结—历程回顾
- java 给定一段时间 按周、月分组
Android开发之MVVM模式实践(六),2021字节跳动春招技术面试题相关推荐
- 2021字节跳动春招技术面试题:mysql间隙锁触发条件
java基础 1.1java的8种基本数据类型装箱拆箱 1.2重写重载封装继承多态 1.3 Stack Queue 1.7 Concurrent包 1.8面向对象 1.9 String StringB ...
- Android开发之MVVM模式实践(六)
Interface interface FlyInterface { /** 获取文章列表 */ @GET("article/") suspend fun get_article_ ...
- Android开发之MVVM模式实践(六),太现实了
Interface interface FlyInterface { /** 获取文章列表 */ @GET("article/") suspend fun get_article_ ...
- 深夜爆肝JS好文!2021字节跳动春招面试题深度讲解
剑指offer -- 2021字节跳动春招面试题深度讲解(JS篇) 1. 深拷贝与浅拷贝 2. 原型与原型链 3. this 指向问题 4. new 关键字做了什么? 5. 原生JS如何实现事件委托? ...
- Android开发之MVVM模式实践:协程与网络请求的结合
前言 大家好,我是小益!在经过前两章对协程的介绍后,我们终于又回到了 MVVM的封装 .协程在Android开发中最常用的场景应该是网络请求了,其次是一些使用 Thread 的场景,本章内容我们将着重 ...
- Android开发之Buidler模式初探结合AlertDialog.Builder解说
什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...
- Android开发之Buidler模式初探结合AlertDialog.Builder讲解
什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就 ...
- Silverlight开发之MVVM模式
前段时间做Silverlight开发,用到了经典的MVVM开发模式,MVVM开发模式的组织形式有多种,但是万变不离其中,就是Module-View-ViewModule的形式,下面就以一个最简单的示例 ...
- Android开发之Java基础JVM和ClassLoader以及类加机制面试题
在面试中被问到Java相关的东西非常多: 首先说下Java内存模型: 主要由: 程序计数器,Java虚拟机栈,本地方法栈=>被线程私有 方法区 堆组成=>被线程共有 Java类加载机制Cl ...
最新文章
- 基于GeoMipmap的地形系统。
- 汇编实验4.1文件代号下的文件管理中为什么buf_size为80而buf可以容纳200个字节,矛盾吗?(不矛盾)
- mysql 1045 登录失败
- linux数据库服务器的配置与管理,实验七_Linux_MySQL数据库服务器配置与管理
- 基本设计模式:单例模式和工厂模式代码实现
- 【BUG记录】> Android dependency ‘androidx.vectordrawable:vectordrawable‘ has different
- mysql5建函数报1064错误,MySQL存储函数创建错误ERROR 1064和1327
- nginx搭建基于http协议的视频点播服务器
- bzoj 1263: [SCOI2006]整数划分
- 基于Netty手写Tomcat
- 文献笔记(9)(2019ISSCC)
- ckplayer 网页视频播放插件
- HDU 4415 Assassin's Creed(贪心)
- html图片铺底代码,梦幻西游底部师徒四人动态图
- 工业相机——感光元件尺寸介绍
- 从各大APP年度报告看用户画像——标签,比你更懂你自己
- 弹弹弹,弹走鱼尾纹的弹出菜单(vue)
- 服务器c盘空间不够解决
- Linux rar unrar的安装
- Centos7 安装部署Kubernetes(k8s)集群过程