Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。

挂起函数是 Kotlin 中的一个特性,用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数,避免了回调地狱问题,使代码更加简洁和易读。在Kotlin中,我们可以使用 suspend 关键字来定义挂起函数,并通过 CoroutineScope 来管理和启动协程。

在真实的开发过程当中,遇到一些第三方的 SDK 是异步回调的,会与自身项目的协程作用域无法配合使用,以下举一个简单的例子:


 定义一个接口和异步操作方法:

interface Callback {
    fun onSuccess(result: String)
    fun onError(error: Throwable)
}

fun fetchData(callback: Callback) {
    // 异步操作
    thread {
        Thread.sleep(1000)
        callback.onSuccess("成功")
    }
}

在方法中模拟在子线程进行异步处理,完成后将数据通过接口返回


以 Activity 的 lifecycleScope 为例:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleScope.launch { // 主线程中开启协程作用域
            Log.e(TAG, "Scope: 开始")

            fetchData(object : Callback {
                override fun onSuccess(result: String) {
                    Log.i(TAG, result)
                }

                override fun onError(error: Throwable) {
                    Log.e(TAG, error.message.toString())
                }

            })

            Log.e(TAG, "Scope: 结束")
        }
    }

实际运行结果:

可以看到,协程内部并没有等待回调完成,直接结束了,因为方法内开启了一个子线程,对于方法而言,逻辑已经执行完毕了,所以直接输出了结束。在真实的开发过程当中,是需要等待接口回调后来执行下一个步骤的,所以需要将异步操作的方法转换为挂起函数


使用 suspendCoroutine 进行封装:

suspend fun fetchDataAsync(): String = suspendCoroutine {
    fetchData(object : Callback {
        override fun onSuccess(result: String) {
            it.resume(result)
        }

        override fun onError(error: Throwable) {
            it.resumeWithException(error)
        }
    })
}

在执行 suspendCoroutine 时,会将当前的协程作用域挂起,直到指定的回调函数调用 continuation.resume 或 continuation.resumeWithException 来恢复它。通过它就能很好的将异步操作转换为挂起函数,以便进行统一的协程管理

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleScope.launch { // 主线程中开启协程作用域
            Log.e(TAG, "Scope: 开始")

            val result = fetchDataAsync()
            Log.i(TAG, result)

            Log.e(TAG, "Scope: 结束")
        }
    }

运行结果:

 


还可以使用 suspendCancellableCoroutine,它是 suspendCoroutine 的可取消版本,追加了协程取消的支持。如果协程被取消,它会自动调用取消逻辑。

suspend fun fetchDataAsync(): String = suspendCancellableCoroutine {
    fetchData(object : Callback {
        override fun onSuccess(result: String) {
            it.resume(result)
        }

        override fun onError(error: Throwable) {
            it.resumeWithException(error)
        }
    })
    it.invokeOnCancellation {
        // 协程取消时执行相应的取消逻辑,比如进行资源的释放等
    }
}

通过这个转换,我们可以利用 Kotlin 协程的强大特性来简化异步代码,让代码更易读且更具维护性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Cache 与 MMU 系列文章 7.3 – ARMv8/v9 MMU 块描述符与页表描述符】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 上篇文章:【ARM Cache 系列文章 7.2 – ARMv8/v9 MMU 页表配置详细介绍 03 】 文章目录 MMU 块描述符与页描述符Block DescriptorBlock descriptor formatsBlock Entry 介绍Block En…

使用Gitblit软件开启git服务器

文章目录 使用Gitblit软件开启git服务器,供局域网其他电脑当做git仓库服务1. java依赖环境安装2. Mac系统操作2.1 下载Gitblit、配置参数2.2 启动服务2.3 终止服务:停止脚本即可 3. window系统操作3.1 下载Gitblit、配置参数3.2 启动服务3.3 终止服务&am…

大学生创新与创业搜题软件?推荐7个搜题软件和学习工具 #媒体#知识分享

随着大学课程的增多和知识的不断积累,大学生们常常面临着繁重的作业和复杂的题目。为了解决这一问题,许多大学生搜题软件应运而生。 1.彩虹搜题 这个是公众号 个性化推荐功能,精准满足需求。更高效地获取你想要的答案。 下方附上一些测试的…

PAT-1009 说反话(java实现)

还是这种题好,多简单啊,题目多清晰明了啊,多让人增加学习的热情啊。 题目 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长…

Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析

本篇将继续深入OpenMAX IL Spec,详细解析Non-tunneled(非隧道)组件的初始化、数据传递以及组件销毁过程。通过阅读本篇内容,我们应能对Non-tunneled组件的buffer分配与状态转换过程有一个清晰的了解。 1、组件初始化 以下是IL Sp…

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南 大家好 我是寸铁👊 总结了【Redis】构建强韧的远程Redis连接与端口保障机制完美指南✨ 喜欢的小伙伴可以点点关注 💝 前言 在当今的软件开发领域中,远程访问和操作数据存储是极为常见…

linux常用命令及其选项

1、常用命令 1.1、ls 选项说明-a显示所有文件及目录 (包括隐藏文件)-i显示inode-A同 -a选项 ,但不列出 "." (目前目录) 及 ".." (父目录)-l列出信息详细(如文件型态、权限、拥有者、文件大小等)-R递归显示(若目录下有文件,则以下之…

Allegro导入DXF文件

阿里狗导入DXF文件 点击File–>Import–>DXF,注意DXF file那边不能使用中文路径和文件名以及非法字符,DXF units一般为mm,结构那边一般都用mm制作图,右边三个选项只需要勾选中间那个,意思是以增加的形式导入&am…

基于协调过滤算法商品推荐系统的设计

管理员账户功能包括:系统首页,个人中心,商品管理,论坛管理,商品资讯管理 前台账户功能包括:系统首页,个人中心,论坛,商品资讯,商家,商品 开发系统…

数据结构和算法一轮

前言 本文参考《2025年数据结构考研复习指导(王道论坛组编)》和相关文章,为考试前复习而写。 目录 前言 第一章线性表 1.1顺序表 1.2单链表 1.3循环链表 ​1.4双向链表 第二章栈和队列 2.1栈 2.2共享栈 2.3链栈 2.4队列 2.5循环…

基于Seatunnel最新2.3.5版本分布式集群安装部署指南(小白版)

基于Seatunnel2.3.5版本分布式集群安装部署 1.环境准备2.JDK安装3.Maven安装4.Seatunnel在master节点安装部署配置4.1.下载Seatunnel安装包4.2.解压下载好的tar.gz包4.3.下载连接器4.4.配置Seatunnel的系统环境变量4.5.配置 SeaTunnel Engine服务 JVM参数4.6.配置文件中集群相关…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

1-什么是护网行动

1.什么是护网行动 2016年,公安部会同民航局、国家电网组织开展了“护网2016”网络安全攻防演习活动。同年,《网络安全法》颁布,出台网络安全演练相关规定:关键信息基础设施的运营者应“制定网络安全事件应急预案,并定期进行演练”…

训练营第三十一天 | 494.目标和474.一和零动态规划:完全背包理论基础518.零钱兑换II

494.目标和 力扣题目链接(opens new window) 难度:中等 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 和 -。对于数组中的任意一个整数,你都可以从 或 -中选择一个符号添加在前面。 返回可以使…

如何提高网站排名?

提高网站排名是一个复杂的过程,涉及到多个方面的优化,包括但不限于内容质量、网站结构、用户体验、外部链接建设等,GSR这个系统,它是一种快速提升关键词排名的方案,不过它有个前提,就是你的站点在目标关键词…

OpenCV学习(4.6) 图像梯度

1.目标 在本教程中: 你会学到如何找到图像的梯度,边缘等。你会学到如下函数:**cv.Sobel(),cv.Scharr(),cv.Laplacian()** 等。 图像梯度是图像处理中的一个基本概念,它用于测量图像亮度变化的强度和方向…

php探针代码怎么写

创建php文件并输入代码,访问文件查看php版本、环境和系统配置信息,可使用ini_set()函数定制输出,但注意在生产环境中使用时要注重安全,因为它会泄露敏感信息。 PHP探针代码撰写指南 PHP探针代码是一种脚本,可提供关于…

接口的应用、 适配器设计模式

接口的应用 适配器设计模式 Inter package com.itheima.a09;public interface Inter {public abstract void show1();public abstract void show2();public abstract void show3();public abstract void show4();}InterAdapter package com.itheima.a09; //抽象 public abs…

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客 Elastic Search(ES)Java 入门实操(3)数据同步-CSDN博客 这篇主要演示 Java 整合…

HQL面试题练习 —— 求连续段的最后一个数及每个连续段的个数

目录 1 题目2 建表语句3 题解 题目来源:拼多多。 1 题目 有一张表t_id记录了id,id不重复,但是会存在间断,求出连续段的最后一个数及每个连续段的个数。 ----- | id | ----- | 1 | | 2 | | 3 | | 5 | | 6 | | 8 | | …