协程(三)—— 协程在并发中的优势

简介: 这篇文章讲讲协程在并发中的优势,并发是个复杂的过程,内部机制就不说了,不太懂也说不好,我们来讲讲处理并发的方法就行。

上一篇讲了启动协程需要满足的三大条件,同时给出了启动协程的栗子,有兴趣可以去看看,链接如下:

https://developer.aliyun.com/article/999244?spm=a2c6h.13148508.setting.14.eeac4f0eDHwSBw

这篇文章讲讲协程在并发中的优势,并发是个复杂的过程,内部机制就不说了,不太懂也说不好,我们来讲讲处理并发的方法就行。

假设现在有这个一个需求,有两个接口,我们需要将两个接口请求后的结果拼接在一起打印出来。

很简单,一般想的都是这样子,先请求接口1,完成后再请求接口2,成功后将两次结果拼接起来打印即可。

我们用Rxjava举个例子:

api.request1()
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(object:SingleObserver<String>{
       override fun onSuccess(s:String){
           api.request2(s)
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(object:SingleObserver<String>{
                   override fun onSuccess(ss:String){
                       Log.e(TAG,s+ss)
                   }
 
                   override fun onSubscribe(d:Disposable){
       
                   }
 
                   override fun onError(e:Throwable){
       
                   }
            });
       }
 
       override fun onSubscribe(d:Disposable){
       
       }
 
       override fun onError(e:Throwable){
       
       }
});

上面的代码可以实现需求,但是能进行了嵌套,代码不美观,设想一下,两个接口做了一次潜套,那如果三个接口呢?四个呢?或者更多呢?代码将十分累赘可读性极差,所以采用嵌套终究不是一个办法。

还有一个问题,现在的做法使接口按照顺序进行了执行,先接口1后再接口2,那如果需要两个接口同时请求呢?不分先后顺序,该如何打印两次请求的拼接结果呢?

我们都知道,接口的请求时间是不定的,而且是在新线程中去执行的,而我们打印是在主线程的,同时请求,我们如何确保在打印的时候,两次请求是已经执行完的呢

针对这个问题,应该会有人做一个延时操作,比如延迟10秒打印,基本可以符合要求,但是做不到万无一失,如果其中某一个接口请求在10秒没执行完呢,那岂不是拿不到接口返回数据呢?所以这种方法也不妥。

还是看看协程的做法吧,先上代码

private val mScope = MainScope()
 
mScope.launch {
    val job1 = async{
        request1()
    }
 
    val job1 = async{
        request2()
    }
 
    Log.e(TAG,${job1.await()}+${job2.await()})
}
 
//请求接口1的方法
suspend fun request1():String{
 api.request1()
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(object:SingleObserver<String>{
                   override fun onSuccess(ss:String){
                       
                   }
 
                   override fun onSubscribe(d:Disposable){
       
                   }
 
                   override fun onError(e:Throwable){
       
                   }
            });
}
 
//请求接口1的方法
suspend  fun request2():String{
 api.request2()
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(object:SingleObserver<String>{
                   override fun onSuccess(ss:String){
                       
                   }
 
                   override fun onSubscribe(d:Disposable){
       
                   }
 
                   override fun onError(e:Throwable){
       
                   }
            });
}

上面代码,我们使用了关键字suspend,把request1跟request2申明为可挂起方法,然后使用launch启动一个协程,在launch里面在开启一个子协程,使用了async的方法,然后我们打印的时候在父协程里面的。

所以,Log.e在执行的时候,会去等待,等待request1跟request2请求完成后才打印。而且可以做到request1跟request2是同时进行的,并发的,我们只不过是在他们请求的时候挂起等待,等待请求结束后再打印。

是不是感觉十分的简单,协程的优势立马凸显出来了,不存在像RxJava一样的嵌套,也不用去考虑请求结束的实际,一切都内部帮我们处理好了,我们只需要按照上面代码那么写就行,然后记得在Activity\Fragment销毁的时候cancel协程就行

mScope.cancel()

还是之前文章的那句话

协程异步就是将耗时的函数标记为suspend,并在协程中调用!不需要开启新线程,不会阻塞UI。

然后还要再加上一句,用同步的方式去表达异步

例子看上去就像同步一样,但实际上是异步执行,这就是协程的魅力所在。that‘s all

相关文章
|
30天前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,尤其是针对Android平台,性能优化和应用流畅度始终是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的线程管理解决方案,为异步编程提供了强大支持,使得编写非阻塞性代码变得更加容易。本文将深入分析Kotlin协程的核心优势,并通过实际案例展示如何有效利用协程提升Android应用的性能和响应速度。
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
239 5
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
26天前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势
在移动开发领域,尤其是针对Android平台,性能优化和流畅的用户体验始终是开发者追求的核心目标。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的新宠,特别是Kotlin协程的引入,为编写异步代码提供了一种全新的范式。本文将深入探讨Kotlin协程在Android应用开发中的应用及其带来的优势,旨在帮助开发者理解并运用协程来提高应用的性能和响应性。
|
29天前
|
移动开发 安全 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,性能优化和应用流畅度始终是开发者追求的核心目标。特别是对于Android平台,由于设备多样性和系统资源限制,如何提升应用的响应速度和处理效率成为关键挑战。近年来,Kotlin语言因其简洁、安全且易于阅读的特性而广受欢迎。其中,Kotlin协程作为一种轻量级的线程管理方案,提供了异步编程的强大能力,使得编写非阻塞性代码变得简单高效。本文将深入探讨Kotlin协程在Android开发中的应用优势,并通过实例演示如何在实际项目中有效利用协程来改善应用性能。
|
1月前
|
程序员 Go 数据处理
|
1月前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第14天】 在移动开发领域,性能优化和响应性是至关重要的。随着Kotlin语言在Android平台中的普及,协程作为其提供的一种轻量级线程管理机制,为开发者提供了编写异步、非阻塞代码的能力。本文将深入探讨Kotlin协程在Android应用开发中的优势,通过实例分析展示如何利用协程简化异步流程,提高应用性能,并保证用户界面的流畅性。
|
2月前
|
存储 安全 Java
深入浅出Go并发之协程—goroutine
深入浅出Go并发之协程—goroutine
35 0
|
2月前
|
开发者 Python
深入浅出Python协程:提高并发性能的秘诀
在现代软件开发中,提高应用程序的并发处理能力是一项挑战,尤其是在资源受限的情况下。本文将探讨Python协程的概念、原理及其在提高并发性能中的应用。通过对比传统多线程和多进程模型,我们将揭示Python协程如何以更少的资源消耗实现高效的并发任务处理。文章还将通过实例代码演示协程的创建、事件循环的管理以及异步编程的最佳实践,旨在为读者提供一种更轻量级、更高效的并发编程方法。
|
2月前
|
程序员 API 调度
深入理解Python协程:提高并发性能的关键
在现代软件开发中,提高应用性能和响应速度已成为开发者不断追求的目标。本文将深入探讨Python协程(Coroutine)机制,一种轻量级的并发编程解决方案,旨在帮助读者理解其工作原理、实现方式及如何在项目中有效利用协程来提高程序的并发性能。通过对比传统多线程和进程的并发模型,文章将展示协程如何以更低的资源消耗实现高效的并发任务处理,从而为开发高性能应用提供了新的视角和方法。
35 0

相关实验场景

更多