Android Kotlin:协程

news2024/9/20 17:01:42

目录:

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.coloradmin.cn/o/1943933.html

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

相关文章

某矿webpack逆向

免责声明&#xff1a; 本篇博文的初衷是分享自己学习逆向分析时的个人感悟&#xff0c;所涉及的内容仅供学习、交流&#xff0c;请勿将其用于非法用途&#xff01;&#xff01;&#xff01;任何由此引发的法律纠纷均与作者本人无关&#xff0c;请自行负责&#xff01;&#xf…

华媒舍:6个媒体宣发套餐,快速突破传播界限

在当今信息爆炸的社会中&#xff0c;有效地传播自己的信息变得愈发困难。特别是对于媒体宣发来说&#xff0c;如何在市场竞争激烈的情况下突破传播界限&#xff0c;让自己的消息传达给更多的人&#xff0c;这是每个企业和个人都面临的难题。 为了解决这个问题&#xff0c;我们推…

图片变更检测

20240723 By wdhuag 目录 前言&#xff1a; 参考&#xff1a; 文件监控&#xff1a; 图片占用问题&#xff1a; 源码&#xff1a; 前言&#xff1a; 由于第三方图像处理软件不能回传图片&#xff08;正常都能做&#xff0c;这里只是不想做&#xff09;&#xff0c;只能在…

有什么好用的AI工具推荐吗?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 所有打工人集合&#xff01;根据你问题中的描述&#xff0c;本小白正好都有涉及过相关领域的AI工具。 今天一次性讲清能处理所有办公场景的AI工具…

Harmony学习(二)------ArkUI(2)

1.主轴对齐方式.justifyContent build() {Column(){Text().width(200).height(100).backgroundColor(Color.Yellow).border({width:2})Text().width(200).height(100).backgroundColor(Color.Yellow).border({width:2}).margin(10)Text().width(200).height(100).backgroundCol…

现货黄金布林线怎么看?又应如何使用?

在现货黄金投资中&#xff0c;技术指标是很多人做交易分析和决策时所需要的工具。当然&#xff0c;由于电脑技术的发达&#xff0c;现在各种技术指标已经有成千上万种&#xff0c;其中一些经典的指标还是很受市场欢迎&#xff0c;比方说布林线。下面我们就来简单地介绍布林线在…

【调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL】

调试笔记-系列文章目录 调试笔记-20240723-Linux-gitee 仓库同步 github 仓库&#xff0c;并保持所有访问链接调整为指向 gitee 仓库的 URL 文章目录 调试笔记-系列文章目录调试笔记-20240723-Linux-gitee 仓库同步 github 仓库&#xff0c;并保持所有访问链接调整为指向 gite…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requ…

typora激活问题

不使用激活码解决。 1.右键桌面图标&#xff0c;打开文件位置 2.按照 Typora路径到 —> resources —> page-dist —> static —> js 这个路径找到这两个文件 LicenseIndex.180dd4c7.xxxxxxx.chunk.js LicenseIndex.180dd4c7.xxxxxxx.chunk.js &#xff08;也可…

MySQL简介(超详细)

课程目标 • 了解数据库基本概念 • 熟悉MySQL数据库的常用操作 • 掌握Insert、Delete、Update、Select等常用SQL语句 • 理解MySQL数据库的事务&#xff0c;索引以及函数 • 了解MySQL数据库的存储过程和触发器 一、什么是数据库&#xff1f; 概念&#xff1a;数据库(D…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植&#xff0c;并不对sfud的移植再进行过多的讲解了哦&#xff0c;所以如果想了解sfud的移植过程&#xff0c;请参考我的另外一篇文章&#xff1a;传送门 正文开始咯 首先我们需要先准备资料准备好&#xff0c;这里对于fatfs的…

Windows图形界面(GUI)-MFC-C/C++ - MFC项目工程框架解析

公开视频 -> 链接点击跳转公开课程博客首页 -> e​​​​​​链接点击跳转博客主页 目录 MFC项目 项目选择 配置安装 程序引导 MFC框架 环境设置 程序框架 代码编写 MFC解析 程序入口 执行流程 代码结构 应用程序类 窗口框架类 消息处理 消息类型 消息…

探索扫描二维码登录的奥秘:从前端到后端的无缝连接

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【React中的无状态组件&#xff1a;简约之美】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1、…

[Jenkins]jenkins-cli.jar调用用户token启动任务

背景&#xff1a;项目入了一群od伙伴&#xff0c;但是od伙伴有单独的构建工程需要提交&#xff0c;由于jenkins的版本太拉闸&#xff0c;不能配置根据role和项目分权限&#xff0c;插件安装失败&#xff0c;不得已想到一个办法。让OD伙伴&#xff0c;在本地&#xff0c;用java&…

音频剪辑里的几种基础操作

音频对于视频的重要性&#xff0c;怎么强调都不为过&#xff0c;它在视频里扮演着举足轻重的角色&#xff0c;对观众有着极为深远的影响。下面为您阐述音频在视频中的关键意义&#xff1a; ① 情感传递&#xff1a;音频有强大的情感传达能力&#xff0c;借助声音的起伏变化、音…

windows网络应急排查

一、系统排查 msinfo32 #GUI显示的系统信息systeminfo #简单了解系统信息用户信息排查 排查恶意账号&#xff1a; 黑客喜欢建立相关账号用作远控: 1.建立新账号2.激活默认账号3.建立隐藏账号(windows中账号名$)cmd方法 net user #打印用户账号信息 ---看不到$结尾的隐藏账…

postgresql 使用navicat 导出报 gs_package 关系不存在问题解决。

1. 问题描述 临时接手的项目&#xff0c;使用的数据库是postgresql&#xff0c;使用navicat 17 Lite 免费版&#xff0c;导出就会报如下图所示的错误&#xff1a;2. 尝试的办法&#xff1a; 1) 换navicat 17 和navicat 17 for postgresql 试用版本 还是一样的错误。 2) 换pos…

大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用&#xff0c;传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下&#xff0c;分布式部署作为一种新型的监控架构&#xff0c;以其灵活性、可扩展性和高可用性&#xff0c;成为了运维团队提升监控效率与可靠…

uni-app pinia搭建

1.新建store文件 新建index.js&#xff0c;代码&#xff1a; // import { // createPinia // } from pinia //const store createPinia() import * as Pinia from pinia const pinia Pinia.createPinia() export * from "./modules/user" export * from ".…