Android结合kotlin使用coroutine的方法实例

 更新时间:2020年12月01日 15:10:58   作者:Jiajun的编程随想  
这篇文章主要给大家介绍了关于Android结合kotlin使用coroutine的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近入了Android坑,目前还处于疯狂学习的状态,所以很久都没有写博客了。今天记录一个小代码片段,在Android上使用coroutine 的小例子。

由于我自己是做一个记账软件来学习的,我用了gRPC,最开始我是使用线程来做网络请求的:

thread {
 // 网络请求代码

 runOnUiThread {
  // 更新UI的代码
 }
}

今天把这一套全部重写成用coroutine。

首先coroutine得有个调度器,英文叫做 “Dispatchers”,有这么几个:

  • Dispatchers.Main 这里面的coroutine跑在主线程上,在Android里也就是UI线程,所以如果在这里面的coroutine也执行大量耗时代码的话,也是会卡UI的
  • Dispatchers.IO 用来跑大IO的
  • Dispatchers.Default 用来跑高CPU消耗的
  • Dispatchers.Unconfined 不绑定在任何特定执行线程上

然后,为了多个coroutine之间可以分组啊,就像进程里可以放很多线程那样,又搞了一个概念,叫做 scope,默认有一个全局scope,叫做 GlobalScope,全局的, 就和全局变量一样,在Android上,这个里面跑的coroutine,生命周期和app一样久,不推荐在这里起coroutine。

推荐的方式是每个Activity里起一个scope,然后再launch。

所以我就这样写基类:

abstract class BaseActivity : AppCompatActivity(), CoroutineScope {
 /*
 默认的coroutine scope是Main,也就是UI线程(主线程)。如果要做IO,比如网络请求,记得
 包裹在 launch(Dispatchers.IO) {} 里,如果要大量计算,包裹在 launch(Dispatcher.Default) {} 里
 或者直接写 launch。 UI操作则用 withContext(Dispatchers.Main) {} 切回来
  */
 private val job = SupervisorJob()
 override val coroutineContext: CoroutineContext
  get() = Dispatchers.Main + job

 override fun onDestroy() {
  super.onDestroy()
  coroutineContext.cancelChildren()
 }

这样子之后,就可以直接launch,起coroutine了:

launch {
 val req = CreateFeedbackReq.newBuilder().build()
 val respAny = callRPC {
  api.createFeedback(req)
 }
 respAny?:return@launch

 val resp = respAny as CreateFeedbackResp
 if (handleRespAction(resp.action)) {
  withContext(Dispatchers.Main) {
   showSnackBar(R.string.thank_you_for_feedback)
   delay(1000)
   finish()
  }
 }
}

如上,默认情况下,root coroutine就是当前所在activity,而他们默认会在 Dispatchers.Main 上执行,如果想要coroutine在 别的 dispatcher 上执行,就用 withContext,然后里面如果又想更新UI的话,就用 withContext(Dispatchers.Main)。

那为啥 launch 不传参数的话,就是直接用的 Dispatchers.Main 呢?因为其实 CoroutineScope 是一个接口,而 coroutineContext 是里面的一个变量:

public interface CoroutineScope {
 /**
  * The context of this scope.
  * Context is encapsulated by the scope and used for implementation of coroutine builders that are extensions on the scope.
  * Accessing this property in general code is not recommended for any purposes except accessing the [Job] instance for advanced usages.
  *
  * By convention, should contain an instance of a [job][Job] to enforce structured concurrency.
  */
 public val coroutineContext: CoroutineContext
}

我们再来看看 launch 的实现:

public fun CoroutineScope.launch(
 context: CoroutineContext = EmptyCoroutineContext,
 start: CoroutineStart = CoroutineStart.DEFAULT,
 block: suspend CoroutineScope.() -> Unit
): Job {
 val newContext = newCoroutineContext(context)
 val coroutine = if (start.isLazy)
  LazyStandaloneCoroutine(newContext, block) else
  StandaloneCoroutine(newContext, active = true)
 coroutine.start(start, coroutine, block)
 return coroutine
}

@ExperimentalCoroutinesApi
public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext {
 val combined = coroutineContext + context
 val debug = if (DEBUG) combined + CoroutineId(COROUTINE_ID.incrementAndGet()) else combined
 return if (combined !== Dispatchers.Default && combined[ContinuationInterceptor] == null)
  debug + Dispatchers.Default else debug
}

可以看到,默认情况下,会把当前的 coroutineContext 放在前面。

Kotlin的coroutine很好用,不过我感觉还是有点复杂,我也还在学习。

ref:

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/index.html

到此这篇关于Android结合kotlin使用coroutine的文章就介绍到这了,更多相关Android结合kotlin使用coroutine内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android开发中使用Volley库发送HTTP请求的实例教程

    Android开发中使用Volley库发送HTTP请求的实例教程

    这篇文章主要介绍了Android开发中使用Volley库发送HTTP请求的实例教程,包括创建Volley单例的基本知识与取消Request请求的技巧等,需要的朋友可以参考下
    2016-05-05
  • Android实现Activity界面切换添加动画特效的方法

    Android实现Activity界面切换添加动画特效的方法

    这篇文章主要介绍了Android实现Activity界面切换添加动画特效的方法,非常实用的技巧,需要的朋友可以参考下
    2014-08-08
  • ActivityManagerService广播并行发送与串行发送示例解析

    ActivityManagerService广播并行发送与串行发送示例解析

    这篇文章主要为大家介绍了ActivityManagerService广播并行发送与串行发送示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android APP存活检测方式

    Android APP存活检测方式

    这篇文章主要介绍了Android APP存活检测方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android中程序的停止状态详细介绍

    Android中程序的停止状态详细介绍

    这篇文章主要介绍了Android中程序的停止状态详细介绍,本文讲解了什么是程序的停止状态、为什么Android要引入这一状态、激活状态和停止状态的切换、如何变为停止状态等内容,需要的朋友可以参考下
    2015-01-01
  • 轻松实现Android自定义九宫格图案解锁

    轻松实现Android自定义九宫格图案解锁

    这篇文章主要帮助大家轻松实现Android九宫格图案解锁功能,可以将图案转化成数字密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android 个人理财工具一:项目概述与启动界面的实现

    Android 个人理财工具一:项目概述与启动界面的实现

    本文主要介绍Android 开发个人理财工具项目概述与启动界面的实现,这里主要对实现项目的流程做了详细概述,并对启动界面简单实现,有需要的小伙伴可以参考下
    2016-08-08
  • Android开发中Listview动态加载数据的方法示例

    Android开发中Listview动态加载数据的方法示例

    这篇文章主要介绍了Android开发中Listview动态加载数据的方法,结合实例形式较为详细的分析了Android操作ListView界面布局与数据动态更新相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Kotlin基础学习之Deprecated与Suppress注解使用

    Kotlin基础学习之Deprecated与Suppress注解使用

    这篇文章主要给大家介绍了关于Kotlin基础学习之Deprecated与Suppress注解使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Flutter网络请求Dio库的使用及封装详解

    Flutter网络请求Dio库的使用及封装详解

    本文主要介绍了Flutter网络请求Dio库的使用及封装详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论