实战
上进唯实战可得,突破绝技成长瓶颈
课程
精品课程应有尽有,快速入门助力成长
手记
分享经验交流心得,学习前沿流行技术
-
Kotlin 1.4 新特性预览
Kotlin 1.4 新特性预览 Kotlin 1.4 没有特别重大的更新,更多的是细节的优化。本文内容已经作为视频更新到 《Kotlin 入门到精通》 当中,请同学们留意。 1. 安装 Kotlin 1.4 Kotlin 1.4 的里程碑版本已经发布了两个,具体发布信息可以在1.4-M1、1.4-M2。 生产环境当中最好仍然使用 Kotlin 的稳定版本(例如最新的 1.3.71),如果你想要立刻马上体验 1.4 的新特性,那么我的建议是先安装一个 EAP 版本的 IntelliJ IDEA EAP 版本是 IntelliJ IDEA 2020.1 Beta,然
1742浏览
2推荐
1评论
-
破解 Kotlin 协程(11) - Flow 篇
Flow 就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,二者之间也有相互转换的 API,使用起来非常方便。 随着 RxJava 的流行,响应式编程模型逐步深入人心。Flow 就是 Kotlin 协程与响应式编程模型结合的产物。 本文基于 Kotlinx.coroutines 1.3.3,由于部分功能尚处于实验阶段,后续也可能会发生细微的调整。 认识 Flow 介绍 Flow 之前,我们先来回顾下序列生成器: 代码清单1: 序列生成器 val ints = sequence { (1..3).forEach { y
2153浏览
1推荐
0评论
-
Kotlin 官网大变样?这是要干啥?
Kotlin 官网这次更新可以算是历史上最大的一次了,跨平台、数据科学等内容也搬到了最前面。 最近有小伙伴提醒我,Kotlin 官网更新了,我打开一看直接吓尿: 这是要干啥?我听说过的没听说过的您这是都要承包吗? 最有意思的是居然把 Android 放到了最后,hmmm,Kotlin 开发者里面搞 Android 的应该是最多的吧?这么不受待见? 所以我有个大胆的想法,Kotlin 团队肯定觉得 Android 大军切换 Kotlin 指日可待,基本上稳稳的,所以过河拆桥:Android 已经不再是 Kotlin 唯一的大
6960浏览
26推荐
5评论
-
破解 Kotlin 协程 番外篇(2) - 协程的几类常见的实现
所谓知己知彼,百战不殆。为了搞清楚 Kotlin 协程是怎么回事,我们也来看看其他语言的协程是怎么实现的。 1. 协程的分类 协程的主流实现虽然细节上差异较大,但总体来讲仍然有章可循。 1.1 按调用栈分类 由于协程需要支持挂起、恢复,因此对于挂起点的状态保存就显得极其关键。类似地,线程会因为 CPU 调度权的切换而被中断,它的中断状态会保存在调用栈当中,因而协程的实现也按照是否开辟相应的调用栈存在以下两种类型: 有栈协程 Stackful Coroutine:每一个协程都会有自己的调
1244浏览
0推荐
1评论
-
破解 Kotlin 协程 番外篇(1) - 协程为什么被称为『轻量级线程』?
接触新概念,最好的办法就是先整体看个大概,再回过头来细细品味。 1. 协程到底是啥? Kotlin 的协程从 v1.1 开始公测(Experimental) 到现在,已经算是非常成熟了,但大家对它的看法却一直存在各种疑问,为什么呢?因为即便我们把 Kotlin 丢掉,单纯协程这个东西本身就已经长时间让大家感到疑惑了,不信的话可以单独搜一下协程或者 Coroutine,甚至连 Lua 之父在提到为什么协程鲜见于早期语言实现,就是因为这概念没有一个清晰的界定。 更有意思的是,在查阅资料的过程中,你会经常
1487浏览
0推荐
2评论
-
破解 Kotlin 协程(10) - Select 篇
Select 并不是什么新鲜概念,我们在 IO 多路复用的时候就见过它,在 Java NIO 里面也见过它。接下来给各位介绍的是 Kotlin 协程的 Select。 复用多个 await 我们前面已经接触了很多挂起函数,那么如果我有这样一个场景,两个 API 分别从网络和本地缓存获取数据,期望哪个先返回就先用哪个做展示: fun CoroutineScope.getUserFromApi(login: String) = async(Dispatchers.IO){ gitHubServiceApi.getUserSuspend(login) } fun CoroutineScope.getUserFromLocal(login:Stri
1322浏览
0推荐
0评论
-
破解 Kotlin 协程(9) - Channel 篇
Channel 实际上就是协程在生产消费者模型上的应用,把过去你用 BlockingQueue 实现的功能替换成 Channel,也许会有新的发现~ Channel 实际上就是一个队列,而且是并发安全的,它可以用来连接协程,实现不同协程的通信。废话不多说,直接看例子: suspend fun main() { val channel = Channel<Int>() val producer = GlobalScope.launch { var i = 0 while (true){ channel.send(i++) delay(1000) } } val consumer = GlobalScope.launch { while(true){ val
1811浏览
1推荐
0评论
-
破解 Kotlin 协程(8) - Android 篇
Android 上面使用协程来替代回调或者 RxJava 实际上是一件非常轻松的事儿,我们甚至可以在更大的范围内结合 UI 的生命周期做控制协程的执行状态~ 本文涉及的 MainScope 以及 AutoDispose 源码:kotlin-coroutines-android 1. 配置依赖 我们曾经提到过,如果在 Android 上做开发,那么我们需要引入 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutine_version' 这个框架里面包含了 Android 专属的 Dispatcher,我们可以通过 Dispatchers
1859浏览
1推荐
0评论
-
破解 Kotlin 协程(7) - 序列生成器篇
说出来你可能不信,Kotlin 1.1 协程还在吃奶的时候,Sequence 就已经正式推出了,然而,Sequence 生成器的实现居然有协程的功劳。 在 Kotlin 当中,Sequence 这个概念确切的说是“懒序列”,产生懒序列的方式可以有多种,下面我们介绍一种由基于协程实现的序列生成器。需要注意的是,这个功能内置于 Kotlin 标准库当中,不需要额外添加依赖。 下面我们给出一个斐波那契数列生成的例子: val fibonacci = sequence { yield(1L) // first Fibonacci number var cur = 1L
1136浏览
1推荐
0评论
-
Android 首选开发语言 Kotlin 又有新花样?
Kotlin 已经很成熟了。有多成熟呢?Kotlin Team 现在的重心已经是在为各个领域内的 Kotlin 实践提供支持了。 新特性 KotlinConf 在 12月5日前后的那几天开完了。Kotlin 1.4 有什么新特性吗?还真有一个,那就是 Kotlin 接口的 SAM 转换(KT-7770) interface Action { fun doAction() } fun runAction(action: Action){ } } fun main(){ runAction { //action here } } 哈哈,终于在新的类型推导到来时,这个特性被支持了。前不久我在录制 《Kotlin 入门到
5652浏览
13推荐
0评论
-
破解 Kotlin 协程(6) - 协程挂起篇
协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?说出来你也许会笑~~(哭?。。抱歉这篇文章我实在是没办法写的更通俗易懂了,大家一定要亲手实践!) 1. 先看看 delay 我们刚刚学线程的时候,最常见的模拟各种延时用的就是 Thread.sleep 了,而在协程里面,对应的就是 delay。sleep 让线程进入休眠状态,直到指定时间之后某种信号或者条件到达,线程就尝试恢复执行,而 delay 会让协程挂起,这个过程并不会
5519浏览
3推荐
3评论
-
破解 Kotlin 协程(5) - 协程取消篇
协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。线程有一个被废弃的 stop 方法,这个方法会让线程立即死掉,并且释放它持有的锁,这样会让它正在读写的存储处于一个不安全的状态,因此 stop 被废弃了。如果我们启动了一个线程并让它执行一些任务,但很快我们就后悔了,stop 还不让用,那该怎么办? val thread = thread { ... } thread.stop() // !!! Deprecated!!! 我们应该
3631浏览
2推荐
1评论
-
破解 Kotlin 协程(4) - 异常处理篇
异步代码的异常处理通常都比较让人头疼,而协程则再一次展现了它的威力。 1. 引子 我们在前面一篇文章当中提到了这样一个例子: typealias Callback = (User) -> Unit fun getUser(callback: Callback){ ... } 我们通常会定义这样的回调接口来实现异步数据的请求,我们可以很方便的将它转换成协程的接口: suspend fun getUserCoroutine() = suspendCoroutine<User> { continuation -> getUser { continuation.resume(it) } } 并最终交给按钮点击事件或者其他事件
3789浏览
1推荐
1评论
-
破解 Kotlin 协程(3) - 协程调度篇
上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 1. 协程上下文 调度器本质上就是一个协程上下文的实现,我们先来介绍下上下文。 前面我们提到 launch 函数有三个参数,第一个参数叫 上下文,它的接口类型是 CoroutineContext,通常我们见到的上下文的类型是 CombinedContext 或者 EmptyCoroutineContext,一个表示上下文的组合,另一个表示什么都没有。我们来看下 CoroutineCon
3932浏览
4推荐
0评论
-
破解 Kotlin 协程(2) - 协程启动篇
破解 Kotlin 协程 - 入门篇 现在你已经知道协程大概是怎么回事了,也应该想要自己尝试一把了吧。本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。 1. 回想一下刚学 Thread 的时候 我相信现在接触 Kotlin 的开发者绝大多数都有 Java 基础,我们刚开始学习 Thread 的时候,一定都是这样干的: val thread = object : Thread(){ override fun run() { super.run() //do w
4462浏览
3推荐
1评论
-
破解 Kotlin 协程 - 入门篇
假定你对协程(Coroutine)一点儿都不了解。 通过阅读本文看看是否能让你明白协程是怎么一回事。 1. 引子 我之前写过一些协程的文章,很久以前了。那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求。 这次准备从协程用户(也就是程序员你我他啦)的角度来写一下,希望对大家能有帮助。 2. 需求确认 在开始讲解协程之前,我们需要先
8194浏览
23推荐
1评论
-
年后再来一波面试“毒鸡汤”
过年回来就看到有群友在讨论面试的事儿。毕竟寒冬嘛,裁员的裁员,裁老板的裁老板;毕竟“金三银四”嘛,年终奖不满意的离职,早就想离职的终于拿了年终奖离职。 机会是变多了,不过也有人发现事情并不是跟想象中的那样顺利。为什么面试总是失败?今天我从面试官角度来尝试跟大家分享一下我的一些感受。 工作了 5 年以上经验的候选人,通常会面试 ”高级工程师“岗位。我面试过程中主要负责 Android 岗位的招聘,按说候选人工作年限都不算短了,最初我也是对他们抱有不小的期望的,不过实
10832浏览
36推荐
8评论
-
以 Kotlin 为例浅谈如何学习程序语言
我的第一门课程 “Kotlin 系统入门与进阶”上线一年来,我不断地与大家探讨学习中的一些问题,最近颇有心得,遂分享给大家。 持续学习 庄子曰:吾生也有涯,而知也无涯。 工作了这么久还要回头来谈学习,也许有些奇怪,但细想下,学校生涯的结束才是诸位学习的又一个新的开始。记得刚工作的时候组里有位大神吐槽:有些人,工作了十年还不如个两年的新人——是这位新人学得太快,还是这位老人学得太慢?都不是,而是这位老同志大概在适应了工作的环境之后就停留在了“舒适区”,止步不前了。
8232浏览
33推荐
2评论
-
你应该学 Kotlin 吗?
自从5.18 Google IO 大会以来,关注 Kotlin 或者说想要搞清楚 Kotlin 是什么的人越来越多了。有不少朋友表示在这之前自己都没有听说过 Kotlin,现在突然 Google 空降一个干儿子,你是不是就慌了呢? 下面我列举几个常见的问题,希望能为大家解惑~ Kotlin 是什么? 我刚刚接触 Kotlin 是在两年前,那会儿的 Kotlin 更像是 A Better Java,它能做 Java 能做的任何事情,而且还要更出色。那时候我们还经常称 Kotlin 是一门 Jvm 语言,尽管 Kotlin-js 也在实验当中;而
23279浏览
118推荐
12评论