Benny Huo

学海无涯,其乐无穷

协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?说出来你也许会笑~~(哭?。。抱歉这篇文章我实在是没办法写的更通俗易懂了,大家一定要亲手实践!)

阅读全文 »

协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。

阅读全文 »

上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。

阅读全文 »

现在你已经知道协程大概是怎么回事了,也应该想要自己尝试一把了吧。本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。

阅读全文 »

假定你对协程(Coroutine)一点儿都不了解,通过阅读本文看看是否能让你明白协程是怎么一回事。

阅读全文 »

== 与 equals 意见不一致的情况

Kotlin 当中 == 和 equals 是等价的,所以所有用 equals 的地方都可以用 == 来替换。

一般情况下这种说法是没问题的,连 IDE 也都会提示你:

要不要换呢?这个就看哪种更有表现力了对不,对于这种情况,换了也就换了~但事情总是有例外,例如:

这回居然不提示我了!所以这里面一定有鬼!

1
2
println(equals)
println(equals2)

你们猜猜结果如何?


我去,说好的 == 等价于 equals 呢?

完了完了,这下说不好了。。扎心了老铁。。官方文档还能不能信啊。。。

阅读全文 »

为什么需要这样一篇文章

我们知道 Kotlin 对 Jvm 的支持实在是太好了,以至于我们创建一个 Java 工程,配置一下 Kotlin 的编译插件和标准库就可以很轻松愉快的开始玩耍,什么互调用、什么单步调试都没有毛病——毕竟 KotlinJvm 与 Java 无论从使用上还是从生态上都尽可能的保持了一致,构建也主要用了 gradle,所以从 Java 到 Kotlin 的切换可谓是无缝衔接。

而 Kotlin 同样支持的 JavaScript 就似乎有点儿麻烦了,毕竟二者所处的生态差异略大,KotlinJs 仍然主要采用 gradle 构建,而 JavaScript 的话,例如 Node.js,就使用 npm/yarn 安装管理依赖了。想想可能还是有点儿别扭,你当然可以自己创建一个简单的 KotlinJs 工程,并且自己负责管理 node_modules,但那样的话,node_modules 的依赖并不会被 KotlinJs 直接依赖到,还需要管理 JavaScript 映射到 Kotlin 的接口依赖,例如 jQuery 在 Kotlinjs 侧就有一个接口库方便 Kotlin 以类型安全的方式调用,不过你还是要自己安装好 jQuery 才行,很麻烦对吧。

这一节我们将给大家展示如何搭建一个基于 Node.js 的相对完美的 KotlinJs 的开发环境,这个环境可以做到:

  • 依赖只需要在 Gradle 中统一管理即可,node_modules 会被自动安装
  • 右键运行 Kotlin 中的 main 函数,就像我们在 KotlinJvm 当中一样
  • 单步调试 Kotlin 代码,全程对 JavaScript 的编译结果无感知

基于这个工程,大家就可以很愉快的测试 KotlinJs 的特性啦,就像我们在 KotlinJvm 上面那样,毫无违和感。

阅读全文 »

今天的话题很简单,分享下也许对大家可以有帮助或者有启发。

1. 背景

一看题目,有点儿晕。看个例子马上就明白了:

1
2
3
4
5
6
7
8
9
10
abstract class EventBuilder() {
protected var retryLimit = 3

fun retryLimit(retryLimit: Int): EventBuilder {
this.retryLimit = retryLimit
return this
}

abstract fun build(): PollingEvent
}

我们有这么一个类,一看就是要写 Builder 模式。不过由于我们的这个 Event 的类型比较多,因此希望写一个父类,来一个子类感受下:

1
2
3
4
5
6
7
8
9
10
11
12
13
class DisposableEventBuilder : EventBuilder() {
private var delay: Long = 0L
fun delay(delay: Long): DisposableEventBuilder {
this.delay = delay
return this
}

override fun build() = object: DisposableEvent(name, delay){
override fun onDisposableEvent() {
callback.onEvent(this)
}
}
}

看上去也没啥大毛病,用一下吧:

1
2
3
DisposableEventBuilder().retryLimit(3)
.delay(60_000) // ERROR!!
.build()

我们调用完父类的 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。

“我 X,这什么玩意儿”,你嘟囔了一句。

阅读全文 »
0%