Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

Kotlin Coroutines(协程) 完全解析(三),封装异步回调、协程间关系及协程的取消

发表于 2018-11-14 | 分类于 Kotlin | | 阅读次数

Kotlin Coroutines(协程) 完全解析系列:

Kotlin Coroutines(协程) 完全解析(一),协程简介

Kotlin Coroutines(协程) 完全解析(二),深入理解协程的挂起、恢复与调度

Kotlin Coroutines(协程) 完全解析(三),封装异步回调、协程间关系及协程的取消

Kotlin Coroutines(协程) 完全解析(四),协程的异常处理

Kotlin Coroutines(协程) 完全解析(五),协程的并发

本文基于 Kotlin v1.3.0-rc-146,Kotlin-Coroutines v1.0.0-RC1

前面两篇文章解析了挂起函数通过状态机来实现,协程的本质就是有三层包装的Continuation,这篇文章进一步解析协程的运用。主要介绍如何将异步回调封装为挂起函数,解析协程之间的关系以及协程的取消。

1. 封装异步回调为挂起函数

在异步编程中,回调是非常常见的写法,那么如何将回调转换为协程中的挂起函数呢?可以通过两个挂起函数suspendCoroutine{}或suspendCancellableCoroutine{},下面看如何将 OkHttp 的网络请求转换为挂起函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
suspend fun <T> Call<T>.await(): T = suspendCoroutine { cont ->
enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
if (response.isSuccessful) {
cont.resume(response.body()!!)
} else {
cont.resumeWithException(ErrorResponse(response))
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
cont.resumeWithException(t)
}
})
}
阅读全文 »

Kotlin Coroutines(协程) 完全解析(二),深入理解协程的挂起、恢复与调度

发表于 2018-07-03 | 分类于 Kotlin | | 阅读次数

Kotlin Coroutines(协程) 完全解析系列:

Kotlin Coroutines(协程) 完全解析(一),协程简介

Kotlin Coroutines(协程) 完全解析(二),深入理解协程的挂起、恢复与调度

Kotlin Coroutines(协程) 完全解析(三),封装异步回调、协程间关系及协程的取消

Kotlin Coroutines(协程) 完全解析(四),协程的异常处理

Kotlin Coroutines(协程) 完全解析(五),协程的并发

本文基于 Kotlin v1.3.0-rc-146,Kotlin-Coroutines v1.0.0-RC1

前面一篇文章协程简介,简单介绍了协程的一些基本概念以及其简化异步编程的优势,但是协程与线程有什么区别,协程的挂起与恢复是如何实现的,还有协程运行在哪个线程上,依然不是很清楚。这篇文章将分析协程的实现原理,一步步揭开协程的面纱。先来看看协程中最关键的挂起函数的实现原理:

1. 挂起函数的工作原理

协程的内部实现使用了 Kotlin 编译器的一些编译技术,当挂起函数调用时,背后大致细节如下:

挂起函数或挂起 lambda 表达式调用时,都有一个隐式的参数额外传入,这个参数是Continuation类型,封装了协程恢复后的执行的代码逻辑。

用前文中的一个挂起函数为例:

1
suspend fun requestToken(): Token { ... }

实际上在 JVM 中更像下面这样:

1
Object requestToken(Continuation<Token> cont) { ... }
阅读全文 »

CocosCreator 中 JS 与 Java 互相调用

发表于 2018-06-25 | 分类于 Cocos | | 阅读次数

最近项目是使用 CocosCreator 开发的一款小游戏,有些功能需要调用 Android 原生代码,这涉及到 CocosCreator 中 JS 与 Java 的互相调用问题,本文记录互相调用时的方式和注意事项。

1. JS 调用 Java 方法

在 CocosCreator 下 JS 调用 Java/Objective-C 的格式都是:

1
var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)

JS 只能调用 Java 中的静态方法,需要传入类名、方法名、方法签名、方法参数,并且可以获得返回值。

阅读全文 »

Mac 中下载阅读 Android 源码

发表于 2018-06-05 | 分类于 Android | | 阅读次数

1. Mac 中下载 Android 源码

准备工作:创建区分大小写的 APFS 宗卷

国内使用 Android Source 官方的下载方式有点慢,所以通常建议使用国内的 AOSP 镜像,一般是中科大的镜像或者清华大学的镜像,本文使用的是清华大学的镜像。

先下载 repo 工具:

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后有两种下载方式,分别适合不同场景。

阅读全文 »

Kotlin 泛型 VS Java 泛型

发表于 2018-05-03 | 分类于 Kotlin | | 阅读次数

建议先阅读我的上一篇文章 – Java 泛型

和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪泛型,和 Java 泛型类型一样。这篇文章将介绍 Kotlin 泛型里中的重要概念,以及与 Java 泛型的对比。

1. 泛型类型与泛型函数

Kotlin 下泛型类型与泛型函数的写法,与 Java 差不多,直接看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
// 泛型类型
class Box<T> {
var t: T? = null
}
// 泛型函数,类型参数在函数名之前
object Util {
fun <K, V> compare(p1: Pair<K, V>, p2: Pair<K, V>): Boolean {
return p1.first == p1.first && p2.second == p2.second
}
}
阅读全文 »
123…16
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 访问量