Android Kotlin:协程

目录:

1)协程是什么?
2)协程和线程的关系?
3)协程如何使用?切线程是什么
4)挂起函数是什么?
5)withContext和lanuch的区别在哪里?
6)Defualt、IO和Main的区别
7)lifecycleScope

一、协程是什么?

协程就是用线程来实现的并发管理库,简单来说就是对线程的封装。那么他的作用是什么?
下面我们来看看一个例子。

以前java

Thread {//进行耗时操作:比如Http操作var user = api.getUser()runOnUiThread {tvName.text = user.getName()//处理后,切换到UI线程,将数据显示出来。}}.start()

现在协程

 CoroutineScope(Dispatchers.Main).launch {var user = api.getUser()tvName.text = user.getName()
}

以前我们要进行一些耗时操作,需要另外起来一个线程,线程处理后,如果要将数据回显到UI,还需要使用方法切换的UI线程。然而,如果使用了协程,这些步骤全部都被封装了起来,我们可以用串行的方式写并行的代码。

二、协程和线程的关系

通过下面这张图,我们可以看到,协程是在线程里面的,就像线程和进程的关系一样。
在这里插入图片描述

三、协程如何使用?切线程是什么

为什么要切线程:因为我要执行耗时操作。

切线程一般两种:

  1. 切到后台线程或子线程。
  2. 切到UI线程。

那么如何切换呢?

(1)这就是一个切换协程的方法(launch )。从任意线程切换到了IO协程。

CoroutineScope(Dispatchers.IO).launch {...
}

(2)使用withContext 方法切换协程

val coroutineScope = CoroutineScope(Dispatchers.Main)coroutineScope.launch(Dispatchers.Main) {        // 在 UI 线程开始withContext(Dispatchers.IO) {    // 切换到 IO 线程//getImage(imageId)                        // 在 IO 线程执行}textView.text = "asdfasdfasdf"              // 回到 UI 线程更新 UI}
// 在UI线程上执行操作
CoroutineScope(Dispatchers.Main).launch {// 更新UI组件textView.text = "Hello,!"
}// 在IO线程上执行网络请求
CoroutineScope(Dispatchers.IO).launch {val result = performNetworkRequest()withContext(Dispatchers.Main) {// 在UI线程上更新UI组件textView.text = result}
}// 在默认的调度器上执行计算密集型任务
CoroutineScope(Dispatchers.Default).launch {val result = performComplexCalculation()withContext(Dispatchers.Main) {// 在UI线程上更新UI组textView.text = result.toString()}
}

四、挂起函数是什么

挂起函数是什么?

他其实就是暂停的意思。就是他执行这个函数的时候,协程就被挂起,协程函数给到其他线程执行,所在的协程就暂停了,执行完后,挂起函数后面的代码才会执行。

挂起的本质就是,协程和线程脱离,暂时不占用线程了,你可以去做别的事情了。协程在其他线程执行完,再切回来。

挂起函数必须在协程里面才能使用,不然挂起谁。

下面我们来看一个例子。

(1)比如我们现在需要发起一个请求

interface HomeApiService {/*** 获取首页Banner数据** @return BaseResponse<List<BannerBean>> Banner列表*/@GET("banner/json")suspend fun getBanners(): BaseResponse<List<BannerBean>> //suspend: 表示这是一个挂起函数,可以在协程中调用,并可以在执行过程中挂起。/*** 获取置顶文章* @return BaseResponse<MutableList<ArticleBean>> 置顶文章列表*/@GET("article/top/json")suspend fun getTopArticle(): BaseResponse<MutableList<ArticleBean>>/*** 根据页面获取分页的文章数据* @param page Int 获取的文章页码 从 0 开始* @return BaseResponse<ArticlePageBean>*/@GET("article/list/{page}/json")suspend fun getArticleByPage(@Path("page") page: Int): BaseResponse<ArticlePageBean>
}

(2)发起请求

  val coroutineScope = CoroutineScope(Dispatchers.Main)coroutineScope.launch(Dispatchers.IO) {       var result = HomeApiService.getBanners()showResult(result)}

HomeApiService.getBanners()这里会挂起,等结果返回后,执行showResult方法。

五、withContext和lanuch的区别

lanuch开启的是并行的切线程,withContext则是串行,也就是withContext其实也是一个挂起函数,后面的代码会等待前面的代码执行完成。而lanuch则不会。
在这里插入图片描述

六、Defualt、IO和Main的区别

  1. io:跟内存之外的世界去交互【读写磁盘,以及进行HTTP请求之类的网络访问】
  2. main:是Android应用程序的主线程调度器,也称为UI线程。它用于执行与用户面相关的操作,例如更新UI组件、处理用户输入等。
  3. Default:这是一个适用于CPU集型任务的调度器。它使用一个线程池来执行并发的计算密集型任务,例如排序、解析大型数据等。Dispatchers.Default通常比Dispatchers.IO更适合执行需要较长时间的计算任务但仍建议将长时间运行的任务放在后台线程中,以避免阻塞UI线程。
  4. main.immediate:main.immediate和main线程的区别就是,如果已经在主线程就不需要使用handler.post抛到主线程,而是直接执行。

七、lifecycleScope

lifecycleScope,是什么?直接再activity里面了。可以直接调用。
他的特点:

  1. 他的生命周期和activity绑定,如果是fragment,则是fragment【意思是如果你正在http请求,那么他也会直接结束?对!!!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1489542.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins的相关概述和安装

Jenkins 1.什么是jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。耗内存max 2. 为什么使用Jenkins 拉取、编译、打包…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

安防巡检机器人:守护安全的智能卫士

安防巡检机器人&#xff0c;作为机器人技术在安防领域的杰出应用&#xff0c;是一种集自主导航、智能巡检、环境监测、远程监控等多功能于一体的智能装备。这些机器人通过集成先进的传感器、高清摄像头、智能算法和导航系统等模块&#xff0c;实现了全天候、全方位、自主化的安…

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…

HDU1059——Dividing,HDU1060——Leftmost Digit,HDU1061——Rightmost Digit

目录 HDU1059——Dividing 题目描述 运行代码 代码思路 HDU1060——Leftmost Digit 题目描述 ​编辑​编辑 运行代码 代码思路 HDU1061——Rightmost Digit 题目描述 运行代码&#xff08;快速幂&#xff09; 代码思路 HDU1059——Dividing 题目描述 Problem - …

索引(数据库优化)事务

索引 事务 Spring事务管理 上图模拟的异常为运行时异常 加上这个配置之后如果回滚会显示下面异常信息 事务进阶

数模打怪(八)之图论模型

一、作图 图的数学语言描述&#xff1a; G( V(G), E(G) )&#xff0c;G&#xff08;graph&#xff09;&#xff1a;图&#xff0c;V&#xff08;vertex&#xff09;&#xff1a;顶点集&#xff0c;E&#xff08;edge&#xff09;&#xff1a;边集 1、在线作图 https://csac…

【单词搜索】python刷题记录

R2-回溯:DFS剪枝. class Solution:def exist(self, board: List[List[str]], word: str) -> bool:#回溯经典问题&#xff1a;DFS剪枝解决mlen(board)nlen(board[0])def dfs(i,j,k):#3种剪枝策略if not 0<i<m or not 0<j<n or board[i][j]!word[k]:return Falsei…

whaler_通过镜像导出dockerfile

1、Whaler简介 Whaler:从镜像导出Dockerfile&#xff0c;whaler英文释义捕鲸船。 2、下载安装 # wget -cO /usr/local/bin/whaler https://github.com/P3GLEG/Whaler/releases/download/1.0/Whaler_linux_amd64 3、赋予可执行权限 [rootlocalhost ~]# chmod x /usr/local/…

学习测试11-移动自动化(略)

安卓SDK 链接: https://pan.baidu.com/s/1P4v9K2RYAGEoA5M_93hHlQ?pwdqsbu 提取码: qsbu 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 记得配置环境变量 下载Appium软件 hub网址&#xff1a;https://github.com/appium/appium-desktop/releases 链接: https…

c++入门----类与对象(中)

OK呀&#xff0c;家人们承接上文&#xff0c;当大家看过鄙人的上一篇博客后&#xff0c;我相信大家对我们的c已经有一点印象了。那么我们现在趁热打铁再深入的学习c入门的一些知识。 类的默认成员函数 首先我们学习的是我们的默认函数。不知道大家刚读这个名词是什么反应。默认…

基于Shell脚本实现文件定时拷贝

需要开发一个需求&#xff0c;将服务器A的 批量数据文件 定时同步 到远程服务器B中&#xff0c;这里我们的基本思路为&#xff1a; 服务器A&#xff1a;存放数据文件服务器B&#xff1a;部署shell脚本&#xff0c;从服务器A中拉取文件至本地目录中。 注意&#xff1a;这里也可…

DDR3布线时候的经验总结

摆放BGA下面的滤波电容的时候注意不要让两个电容的电源和地对着头放&#xff0c;手工焊接时候容易短路 阻抗层必须是实心铜皮覆盖&#xff1a; &#xff08;3&#xff09;阻抗线一定要有阻抗参考层&#xff0c;一般以相邻的接地或电源层做参考层&#xff08;如顶层阻抗线&…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

解决腾讯云服务器登录宝塔面板忘记密码

文章目录 1.问题描述2.解决方案&#xff1a;3.总结 1.问题描述 宝塔忘记了密码&#xff0c;在腾讯云面板输入bt打算修改密码显示报错 2.解决方案&#xff1a; 输入如下指令 sudo bt再选择5即可修改密码&#xff08;如下图&#xff09; 3.总结 本质原因是自己直接输入bt…

【运算放大器】输入电压范围与输出电压范围

概述 总结运算放大器的输入电压范围和输出电压范围基本理论。 总结于《你好&#xff0c;放大器初识篇》。 文章目录 概述一、输入电压范围&#xff08;Input Voltage Range&#xff09;二、输出电压范围&#xff08; V O H / V O L V_{OH}/V_{OL} VOH​/VOL​ 或者 Swing fro…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

前端JS特效第58波:洋葱剥皮文本变形特效

洋葱剥皮文本变形特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Onion Skinning Text Morphing</title><link…

若依ruoyi+AI项目二次开发(智能售货机运营管理系统)

(一) 帝可得 - 产品原型 - 腾讯 CoDesign (qq.com)