美文网首页Kotlin Three我与 Kotlin 的爱恨情仇Kotlin编程
我与 Kotlin 的爱恨情仇之浅谈 async/await

我与 Kotlin 的爱恨情仇之浅谈 async/await

作者: IMSk | 来源:发表于2017-05-25 23:01 被阅读2166次

    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.

    写了前几篇文章之后,今天回来在想给大家聊点什么呢?整理文件的时候发现了一张照片,让我想起到了这个话题,至于是什么照片,不妨听我慢慢道来。

    async/await 是什么?

    我不知道你是否写过 c# ,不�,严格意义上来说,应该说是写过2012年之后的 c#,如果写过,那么OK,我想这篇文章,你可以直接翻到最后啦,如果没有,那么我倒是冒昧的讲讲。

    Kotlin 1.1版本更新中 ,介绍了 async/await 的基本用法。在文章开头我也引用了文中的描述。 Kotlin1.1 版本中引入了这个概念,可以自行实现,比如用 RX 来实现。

    从字面意思,async 异步, await 等待 ,就能看出来是为了解决异步任务的难题。

    我爱 async/await

    真的很爱,因为异步任务到处可见,一个提交表单,又或是加载一张图片,又或是普通的读写磁盘,都是非常耗时的。为了改善用户体验,往往我们会把这些耗时的 Task 放在后台 background 等事情处理好之后,回调给主线程更新视图。

    那么在没有 async/await 的时候,我们 Android 怎么活下来的呢?

    • asynctask
      大概长这个样子:
     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就算了的,那么多年没有碰过 .Net 了的 。

    还好 有幸 拿了第二名。

    但这次比赛,让我�真的有幸的接触了 2012一年以后的.NET,完全是另外一个世界啦。写起来太爽了的。其中就包括 async/await (虽然内部实现还是task), 所以当我看到 《Kotlin 1.1 版本更新介绍》的时候, WOW,�这不是当年的 .Net嘛, Kotlin 你终于也有了的哦。万分开心。

    如果您愿意听我聊技术,可以关注我的个人公众号 SKMacTalk

    SKMacTalk.png

    更多一手资料请关注我们 KotlinThree 公众号,也可以投稿哟~

    KotlinThree

    相关文章

      网友评论

      • 鱼兔子12138:苍茫的大海啊...都是水
        IMSk:@鱼兔子12138 当时不知道如何讲起… 我也不太擅长去讲这些
      • 2d4053c53cab:写的真水,看不到干货:flushed:
        IMSk:@咖喱不见不散啊 是的,当时不晓得写什么好。只是提了下有这个东西,更多是贴了下官方地址,大家可以自己去看看。等后面协程稳定了,再好好一并讲讲吧。

      本文标题:我与 Kotlin 的爱恨情仇之浅谈 async/await

      本文链接:https://www.haomeiwen.com/subject/oyftfxtx.html