We all know that blocking is bad under a high load, that polling is a no-go, and the world is becoming more and more push-based and asynchronous. Many languages (starting with C# in 2012) support asynchronous programming through dedicated language constructs such as async/await keywords. In Kotlin, we generalized this concept so that libraries can define their own versions of such constructs, and async is not a keyword, but simply a function.
写了前几篇文章之后,今天回来在想给大家聊点什么呢?整理文件的发现了一张照片,让我想起到了这个话题,至于是什么照片,不妨听我慢慢道来。
我不知道你是否写过 c#
,不 严格意义上来说,是写过 2012 年之后的 c#
,如果写过,那么 OK,我想这篇文章,你可以直接翻到最后啦,如果没有,那么我倒是冒昧的讲讲。
在 Kotlin 1.1 版本更新中 ,介绍了 async/await
的基本用法。在文章开头我也引用了文中的描述。 Kotlin
在 1.1
版本中引入了这个概念,可以自行实现,比如用 RX
来实现。
从字面意思,async
异步, await
等待 ,就能看出来是为了解决异步任务的难题。
真的很爱,因为异步任务到处可见,一个提交表单,又或是加载一张图片,又或是普通的读写磁盘,都是非常耗时的。为了改善用户体验,往往我们会把这些耗时的 Task
放在后台 background
等事情处理好之后,回调给主线程更新视图。
那么在没有 async/await
的时候,我们 Android
怎么活下来的呢?
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
别哭,当年我们就是这么过来的。但遇到了太多的坑,这里就展开了的。
Java Runnable & Android Handler
配合 ThreadPoolExecutor
确实可以解决大量问题,任务调度自己处理,再配合 Handler
来切换到主线程,完全可以满足日常需求。but 使用起来,还是很不爽,比较繁琐。
Java Future & Android Handler
跟 Runnable
大相径庭,这里就不在展开了的,具体可以看文档 [《 Future 》]( https://developer.android.com/reference/java/util/concurrent/Future.html )
那么有了 async/await
之后, 现在呢?
fun main(args: Array<String>) {
val future = async<String> {
(1..5).map {
await(startLongAsyncOperation(it)) // suspend while the long method is running
}.joinToString("\n")
}
println(future.get())
}
async
是一个异步的 blok
, 如果你不懂 blok
,可以等会去看看我之前的一篇关于 block
的介绍 《我与 Kotlin 的爱恨情仇之浅谈 block 》。简单的说就是后面跟了一个 代码块
,返回的是一个字符串类型。 block
里面做了一个简单的 一个 map
操作,每次循环都执行 await
等待的耗时操作。 如果在没有 async/await
出来之前,这里确实很难写到这么简洁。
async/await
No, 到了这个节点,只是一个形式, 我非常喜欢这种简洁方式。非要让我说一个不爱的理由,那么我只能说:“ hi, 你为什么出来的这么晚???,以至于到现在我项目中还没有用到”。
为什么会提到这个话题,只是因为整理照片的时候发现了以前痛苦的往事。
2014 年 有幸
去参加了 微软马拉松比赛
,c#
一个只是当年大学折腾过 ASP.NET
和被折磨到哭的ADO.NET
, 尤其是后者往事不堪回首。如果您折磨过,请在楼下评论去按个 1
。然而还是被公司强行带到微软 园区参加比赛,各种苦,因为完全没有接触过 WP
。
还好 有幸
拿了第二名。
但这次比赛,让我 真的有幸的接触了 2012 一年以后的.NET
,完全是另外一个世界啦。写起来太爽了的。其中就包括 async/await
(虽然内部实现还是 task), 所以当我看到 Kotlin 1.1 版本更新介绍的时候,WOW, 这不是当年的 .Net
嘛, Kotlin
你终于也有了的哦。开心。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.