以上是我们创建协程的实现方式,我们可以通过指定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字节跳动春招技术面试题相关推荐

  1. 2021字节跳动春招技术面试题:mysql间隙锁触发条件

    java基础 1.1java的8种基本数据类型装箱拆箱 1.2重写重载封装继承多态 1.3 Stack Queue 1.7 Concurrent包 1.8面向对象 1.9 String StringB ...

  2. Android开发之MVVM模式实践(六)

    Interface interface FlyInterface { /** 获取文章列表 */ @GET("article/") suspend fun get_article_ ...

  3. Android开发之MVVM模式实践(六),太现实了

    Interface interface FlyInterface { /** 获取文章列表 */ @GET("article/") suspend fun get_article_ ...

  4. 深夜爆肝JS好文!2021字节跳动春招面试题深度讲解

    剑指offer -- 2021字节跳动春招面试题深度讲解(JS篇) 1. 深拷贝与浅拷贝 2. 原型与原型链 3. this 指向问题 4. new 关键字做了什么? 5. 原生JS如何实现事件委托? ...

  5. Android开发之MVVM模式实践:协程与网络请求的结合

    前言 大家好,我是小益!在经过前两章对协程的介绍后,我们终于又回到了 MVVM的封装 .协程在Android开发中最常用的场景应该是网络请求了,其次是一些使用 Thread 的场景,本章内容我们将着重 ...

  6. Android开发之Buidler模式初探结合AlertDialog.Builder解说

          什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...

  7. Android开发之Buidler模式初探结合AlertDialog.Builder讲解

    什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就 ...

  8. Silverlight开发之MVVM模式

    前段时间做Silverlight开发,用到了经典的MVVM开发模式,MVVM开发模式的组织形式有多种,但是万变不离其中,就是Module-View-ViewModule的形式,下面就以一个最简单的示例 ...

  9. Android开发之Java基础JVM和ClassLoader以及类加机制面试题

    在面试中被问到Java相关的东西非常多: 首先说下Java内存模型: 主要由: 程序计数器,Java虚拟机栈,本地方法栈=>被线程私有 方法区 堆组成=>被线程共有 Java类加载机制Cl ...

最新文章

  1. 基于GeoMipmap的地形系统。
  2. 汇编实验4.1文件代号下的文件管理中为什么buf_size为80而buf可以容纳200个字节,矛盾吗?(不矛盾)
  3. mysql 1045 登录失败
  4. linux数据库服务器的配置与管理,实验七_Linux_MySQL数据库服务器配置与管理
  5. 基本设计模式:单例模式和工厂模式代码实现
  6. 【BUG记录】> Android dependency ‘androidx.vectordrawable:vectordrawable‘ has different
  7. mysql5建函数报1064错误,MySQL存储函数创建错误ERROR 1064和1327
  8. nginx搭建基于http协议的视频点播服务器
  9. bzoj 1263: [SCOI2006]整数划分
  10. 基于Netty手写Tomcat
  11. 文献笔记(9)(2019ISSCC)
  12. ckplayer 网页视频播放插件
  13. HDU 4415 Assassin's Creed(贪心)
  14. html图片铺底代码,梦幻西游底部师徒四人动态图
  15. 工业相机——感光元件尺寸介绍
  16. 从各大APP年度报告看用户画像——标签,比你更懂你自己
  17. 弹弹弹,弹走鱼尾纹的弹出菜单(vue)
  18. 服务器c盘空间不够解决
  19. Linux rar unrar的安装
  20. Centos7 安装部署Kubernetes(k8s)集群过程

热门文章

  1. 不错的一篇关于强迫症的文章
  2. MySQL是如何实现读已提交和可重复读的——MVCC原理
  3. 微信记录 android id,记录微信分享的一些坑
  4. 效果教程,教大家怎么做叶雕效果
  5. 余秋雨:《苏东坡突围》
  6. mybatisplus 分页组件
  7. 读书感受 之 《以眨眼干杯》
  8. iptables限速
  9. 单片机51汇编语言的编程过程
  10. 决策树以及XGBoost 树分裂图的多种可视化工具盘点