【為什麼要寫這本書】
我應該算是國內比較早接觸和使用Kotlin的開發者了。
知道這門語言完全是個偶然。當時我還在阿裡巴巴實習,周末沒事去公司蹭喫蹭喝蹭電腦,編譯了Hotspot源碼覺得還不過癮,又開始編譯IntelliJ IDEA的社區版。
某天下午我遇到件煩心事,編譯並不是很順利。我發現有一種沒見過的後綴為kt的文件,頓時感到壓力倍增,Groovy和Scala我還沒學會呢,怎麼又來一個!不過,當時我隻是按照說明把Kotlin的環境搭建好,並沒有繼續理會這門還處在v0.8的語言。
畢業之後我就職於騰訊地圖,得益於團隊良好的技術氛圍以及對新人的鼓勵和信任,入職年就能有機會負責重構地圖SDK,後來為團隊貢獻了不少公共組件。整個過程中我既充分感受到了Java的魅力,也發現了它在開發效率上的不足。於是我試著用Groovy、Scala甚至Python來開發Android,但都不太理想,後想起JetBrains家的“小兒子”Kotlin,結果就一發不可收拾。
Lambda,我所欲也;擴展函數,亦我所欲也。二者居然可兼得。後來我的業餘時間也從研究“茴香豆的‘茴’有幾種寫法”變成了研究“這段Java代碼用Kotlin能怎麼簡化”。可是,當時身邊的同事和同行似乎並沒有對Java感到疲憊,於是我又開始試著錄視頻、寫文章,終走上了Kotlin的布道之路。
幸運的是,Kotlin在2017年的Google I/O大會上被提為Android開發的一級語言,這著實讓它火了一把。那時候絕大多數Android工程師可能都沒有聽說過這門語言,它有何德何能竟會受到Google的青睞?
當時,我和幾個天天因Kotlin的特性而相互“口誅筆伐”的群友們聚到一起,考慮是否要寫本書—大家也許需要這樣一本書來了解Kotlin。不過,這本書因寫作時間很長,耗盡了大家的熱情,我們尚未定稿,國內其他Kotlin入門書已陸續面世。至於我負責的協程部分,從協程還是個“寶寶”開始,先後重寫了三次,現在的Kotlin協程儼然是一位“大叔”了。
2019年,機械工業出版社的楊福川老師找到我,問我要不要寫點什麼。我想,Kotlin協程現在仍然是一個很大的麻煩,國內外都沒有很好的資料,官方文檔又過於精練,不太適合大家入門和進階。於是就有了這本書。
Kotlin協程不像Python、JavaScript的async/await那樣容易上手,後者似乎根本不需要明白什麼是協程就能輕松使用。
我曾試著從Kotlin協程的標準庫API開始講—這樣的好處是大家能夠打好基礎,結果大多數讀者反饋這樣不易學習。於是在“破解Kotlin協程”繫列文章中,我從一開始就基於Kotlin項目組提供的協程框架開始介紹,並對比RxJava從實際問題切入,讀者反映這可能是通俗易懂的協程文章了。不過很快,在介紹到調度器和掛起原理等內容的時候,讀者就開始叫苦了,反饋說讀起來如同天書一般。
當然,這其中也不乏感覺良好的讀者,他們期望我能繫統地對比一下Kotlin與其他語言的協程實現的異同,這說明這部分內容本身不是問題,問題可能是鋪墊做得不足。於是我仔細分析了讀者反饋的問題,發現多數問題源自大家對於協程概念理解的偏差。因此在本書中,我從一開始就緊緊抓住概念問題,從各個角度去闡釋什麼是協程,以及Kotlin協程與其他常見語言的協程在實現上有何區別。在探討概念的時候,我盡可能用實際問題引入,逐步給出解決思路,由簡入繁,將協程的設計思路和實現細節盡可能地呈現出來。
還有朋友建議我在文章中多提供一些圖表以方便理解,為此我在本書中為所有關鍵節點提供了相應的狀態圖、時序圖等,希望能夠幫助讀者輕松理解探討的內容。
【讀者對像】
本書適用於有一定基礎的Kotlin開發者,包括但不限於正在使用和希望使用Kotlin開發Android、Web服務、iOS、前端等應用的開發者。
本書不會講解Kotlin的基礎語法,因此建議Kotlin初學者先閱讀基礎書,《Kotlin核心編程》就是一個不錯的選擇。你也可以訪問https://coding.imooc.com/class/398.html參考我在慕課網發布的“Kotlin入門到精通”視頻課程,視頻中詳細講解了Kotlin的基礎與進階知識,其中的協程部分可以與本書配套學習。
【本書特色】
Kotlin協程背後的知識點非常多,本書從異步程序的設計入手,探討異步程序設計中要面對的關鍵問題,並在之後圍繞這幾個關鍵問題對Kotlin協程的設計實現展開探討。
在剖析Kotlin協程的過程中,本書除介紹API的基本用法以外,還提供了使用Kotlin協程設計實現各類復合協程API的思路和方法,並抽像出一套繫統的設計思路,通過CoroutineLite這個項目的設計實現,幫助大家深入了解官方協程框架的內部運行機制。
在幫助讀者掌握Kotlin協程內部原理的同時,本書還從Android、Web應用和多平臺等角度提供了實踐思路,幫助讀者做到在原理上深入淺出,在實戰中融會貫通。
為了方便內容的展開,在探討的過程中本書也對一些概念明確進行了定義和歸納,例如簡單協程、復合協程、協程體等。
本書包含了豐富的示例,以便於讀者閱讀參考。
為提升讀者的閱讀體驗,本書所有代碼均采用JetBrains Mono字體,該字體由Kotlin項目團隊所屬公司JetBrains為開發者專門打造,更適合代碼的閱讀。
【如何閱讀這本書】
本書基於撰寫時的Kotlin v1.3.61來講解Kotlin協程的基本概念、實現原理和實踐技巧。全書共9章,具體內容如下。
第1章主要從程序設計出發,結合實際問題引出異步程序的設計方案。異步程序的設計和實現是本書探討的協程的基本應用場景,也是本書內容的基石。
第2章主要從協程本身切入,剖析協程是什麼、有哪些類別,以及不同語言的協程實現有何種區別和聯繫等。這一章內容是理解Kotlin協程概念的前提。
第3章主要以Kotlin標準庫的協程API為核心,闡述簡單協程的使用方法和運行機制。簡單協程是復合協程的基礎,掌握這部分內容是理解協程工作機制的關鍵。
第4章主要介紹運用Kotlin協程的基礎設施設計和實現復合協程的思路和方法,為後續對官方協程框架的學習和運用奠定基礎。
第5章以官方協程框架為模板,介紹如何逐步實現其中的核心功能,以幫助讀者了解其中的實現細節,並對復合協程的運行機制做到心中有數。這部分內容也是對前幾章所述基礎知識進行靈活運用的體現。
第6章介紹官方協程框架的運用,重點探討了Channel、Flow、select的使用場景。至此,我們就已經掌握了將協程運用到實踐中的基本技能。
第7章主要探討協程在以Android為例的UI應用程序開發環境中面臨的挑戰和解決問題的方法,重點介紹了協程與Android生命周期的結合、協程與RxJava的互調用,以及Retrofit、Room等框架對協程的支持。
第8章主要探討協程在Web服務開發場景中的運用,重點給出了基於Spring、Vert.x、Ktor這幾個框架運用協程解決異步問題的方法和思路。
第9章主要介紹在除JVM以外的JavaScript和Native平臺上,Kotlin協程的應用情況。
整體看來,第1~3章側重於概念的介紹,第4章和第5章側重於介紹如何將簡單協程封裝成復合協程,第6章介紹官方框架所提供的復合協程的使用方法,第7~9章側重於實戰運用。
建議對協程不了解的讀者從前到後循序漸進地閱讀本書。如果對協程有一定的認識,包括有在Lua、Go、JavaScript等語言中使用協程解決異步問題的經驗,可以嘗試從第6章開始閱讀,在遇到不清楚的地方時再有目的地查閱前面的內容。如果想要快速體驗協程的魅力,也可以直接從第7章開始挑選自己感興趣的內容閱讀,但全面了解協程的運行機制和原理仍然非常必要。
另外需要說明的是,本書在第2章介紹協程的概念時橫向對比了幾類典型的協程實現,在第4章中會使用Kotlin仿照這些協程的實現風格給出對應的復合協程實現,這其中涉及Lua、JavaScript、Go等語言,大家不需要對這些語言有更多的認識和了解,隻需了解它們的實現形式即可。