本書的主要內(nèi)容有:了解Kotlin基礎(chǔ)知識(shí)和Kotlin集合框架。探索Android基礎(chǔ):操作系統(tǒng)和應(yīng)用容器及其組件。了解線程安全以及如何處理并發(fā)。編寫低開銷順序異步工作。使用協(xié)程檢查結(jié)構(gòu)化并發(fā)性,并了解通道如何支持協(xié)程通信。了解如何使用流完成異步數(shù)據(jù)處理。使用Android性能分析工具了解性能問題。使用性能優(yōu)化減少資源消耗。
為Android移動(dòng)操作系統(tǒng)開發(fā)應(yīng)用似乎很令人生畏,尤其是如果還需要學(xué)習(xí)一種新的編程語言:Kotlin,這是目前Android的官方開發(fā)語言。利用這本實(shí)用的書,Android開發(fā)人員將學(xué)習(xí)如何從Java過渡到Kotlin,包括Kotlin如何為獲得異步計(jì)算控制提供真正的優(yōu)勢(shì)。
本書作者探討了原生Android開發(fā)中常見任務(wù)的實(shí)現(xiàn),并展示了Kotlin如何幫助你解決并發(fā)問題。這本書主要關(guān)注結(jié)構(gòu)化并發(fā)(一種新的異步編程范式),將帶你了解Kotlin最z強(qiáng)大的構(gòu)造之一:協(xié)程。
前言JetBrains 創(chuàng)建Kotlin 有兩個(gè)原因:沒有一種語言可以填補(bǔ)Android 開發(fā)中使用(遺留)Java 庫(kù)的所有空白,另外一種新的語言將允許Android 開發(fā)引領(lǐng)趨勢(shì),而不只是追隨潮流。2015 年2 月,Kotlin 10 正式發(fā)布。Kotlin 簡(jiǎn)潔、安全、實(shí)用,并且強(qiáng)調(diào)與Java代碼的互操作性。當(dāng)今使用Java 的任何地方都可以使用Kotlin:服務(wù)器端開發(fā)、Android 應(yīng)用、桌面或移動(dòng)客戶端、物聯(lián)網(wǎng)設(shè)備編程等。Kotlin 在Android 開發(fā)人員中迅速流行起來,Google 決定采用Kotlin 作為Android 開發(fā)的官方語言,這使得人們對(duì)這個(gè)語言的興趣暴漲。根據(jù)Android 開發(fā)者網(wǎng)站(https://developerandroidcom/kotlin),目前有超過60% 的專業(yè)Android 開發(fā)人員使用Kotlin。Android 的學(xué)習(xí)曲線相當(dāng)陡峭:不可否認(rèn),它很難學(xué)習(xí),更難掌握。對(duì)很多人來說,Android 開發(fā)人員成長(zhǎng)的一部分,就是隨著時(shí)間的推移,要不斷處理Android操作系統(tǒng)與應(yīng)用之間意想不到的交互。本書通過研究Android 中的這些問題,旨在向讀者深入詳盡地介紹這些情況。我們不僅會(huì)討論Kotlin 和Java,還將討論使用Android 時(shí)出現(xiàn)的并發(fā)問題,以及Kotlin 如何解決這些問題。有時(shí)我們會(huì)將Kotlin 與Java 進(jìn)行比較,因?yàn)槲覀冋J(rèn)為這樣做能更好地理解(特別是大部分讀者都可能有Java 背景)。我們可以利用實(shí)用示例演示如何彌補(bǔ)二者的差距,并展示大多數(shù)Kotlin 操作的底層概念都與Java 的相應(yīng)概念很類似。我們將按主題組織這些任務(wù),對(duì)涉及的大量信息進(jìn)行結(jié)構(gòu)化分解,以便軟件工程師掌握,并展示如何使應(yīng)用健壯并且可維護(hù)。另外,熟悉Java 的用戶(包括Android 開發(fā)人員)會(huì)發(fā)現(xiàn),我們同時(shí)在Java 和Kotlin 中介紹各個(gè)常見任務(wù)時(shí),它們的學(xué)習(xí)曲線會(huì)大大變平。在適當(dāng)?shù)那闆r下,我們會(huì)討論其中一個(gè)語言或兩個(gè)語言的區(qū)別和缺陷,不過我們希望提供簡(jiǎn)單易懂的任務(wù)示例,使讀者能夠掌握和適應(yīng)現(xiàn)代范式,并立即本能地意識(shí)到更新代碼的重要性。盡管Kotlin 與Java 可完全互操作,但其他Java 應(yīng)用開發(fā)(服務(wù)器端編程、桌面客戶端、中間件等)還沒有趕上Android 的程度。這很大程度上是由于Android的維護(hù)者(Google)強(qiáng)烈鼓勵(lì)其用戶做出改變。用戶逐步遷移到Kotlin,但更多的用戶仍然使用Java 來完成關(guān)鍵任務(wù)。我們希望這本書能成為Android 開發(fā)人員的生命線,讓他們能夠放心地利用Kotlin 提供的優(yōu)勢(shì)和簡(jiǎn)單性。本書面向的讀者這本書面向超過600 萬Android 工程師中的每一個(gè)人。我們相信幾乎每個(gè)Android 工程師都能從這本書中受益?赡苡幸恍〔糠秩四芰骼厥褂肒otlin,即使如此,他們也能從我們介紹的信息中有所收獲。但事實(shí)上,我們面向的是絕大多數(shù)還沒有過渡到Kotlin 的人。這本書也適合那些在以Java 為中心的Android開發(fā)中已經(jīng)接觸過Kotlin,但還沒有完全熟悉Kotlin 的人:場(chǎng)景1讀者精通Java,聽說過這種新的Kotlin 語言,并想嘗試一下。所以他們讀了一些在線教程,開始使用,效果很好。很快他們就意識(shí)到這不僅僅是一種新的語法。習(xí)慣用法不一樣了(例如,函數(shù)式編程,協(xié)程),現(xiàn)在可以采用一種全新的開發(fā)方式。不過他們?nèi)狈χ笇?dǎo)。對(duì)他們來說,這本書將非常適合。場(chǎng)景2讀者是一個(gè)Java 開發(fā)小團(tuán)隊(duì)的一員。他們對(duì)是否應(yīng)該在項(xiàng)目中包含Kotlin 進(jìn)行了討論。盡管據(jù)說Kotlin 與Java 100% 可互操作,但一些同事認(rèn)為引入另一種語言會(huì)增加項(xiàng)目的復(fù)雜性。還有一些人認(rèn)為,由于需要掌握兩種語言,這可能會(huì)限制能夠參與該項(xiàng)目的同事人數(shù)。如果能證明利大于弊,這些讀者可以用這本書來說服他們的同事。場(chǎng)景3有經(jīng)驗(yàn)的Android 開發(fā)人員可能使用過Kotlin 或用Kotlin 寫過一個(gè)功能,但需要完成具體工作時(shí),還是會(huì)使用Java。我們發(fā)現(xiàn)現(xiàn)在就是這種情況,這本書會(huì)讓我們的生活更輕松。這也是我們周圍最常見的狀態(tài),很多Android 開發(fā)人員接觸過Kotlin,認(rèn)為他們足夠了解這個(gè)語言,能夠在必要時(shí)編寫Kotlin代碼,但他們要么沒有意識(shí)到要么根本不相信數(shù)據(jù)類、不可變屬性和結(jié)構(gòu)化并發(fā)的重要性。我們認(rèn)為這本書能讓一個(gè)好奇的人成為一個(gè)盡心盡力的布道者。為什么寫這本書有大量的書介紹Android 如何工作,Kotlin 如何工作,或者并發(fā)如何工作。Kotlin因其易用性和更簡(jiǎn)潔的語法在Android 開發(fā)中廣受歡迎,但Kotlin 為Android 提供的遠(yuǎn)不止這些:它提供了解決Android 并發(fā)問題的新方法。我們寫這本書是為了深入地探討這些主題之間特定的關(guān)系。不論單獨(dú)來看還是合在一起,Android和Kotlin 都在快速變化。想要跟上所有這些變化可能很困難。我們把這本書看作是一個(gè)有意義的檢查點(diǎn):它介紹了Android 的起源,當(dāng)前的位置,以及隨著Kotlin 語言的成熟,將如何繼續(xù)與Kotlin 一起發(fā)展。本書內(nèi)容組織有時(shí)我們會(huì)加入代碼片段的截圖,而不是常規(guī)的atlas 代碼格式。這對(duì)于協(xié)程和流特別有用,因?yàn)樵诮貓D中可以清楚地看到掛起點(diǎn),還可以獲得IDE 的類型提示。第1 章Kotlin 基礎(chǔ)和第2 章Kotlin 集合框架介紹了Kotlin 中實(shí)現(xiàn)Android編程的重大轉(zhuǎn)變。雖然這幾章中的信息足以為你奠定一個(gè)很好的Kotlin 基礎(chǔ),不過后面的章節(jié)將更深入地探討更復(fù)雜/ 更高級(jí)的特性。熟悉Java 或類似語法結(jié)構(gòu)的用戶會(huì)發(fā)現(xiàn)這種轉(zhuǎn)換非常自然。第3 章Android 基礎(chǔ)和第4 章Android 并發(fā)將提供與內(nèi)存和線程相關(guān)的Android 系統(tǒng)基礎(chǔ)知識(shí)。與其他操作系統(tǒng)一樣,并發(fā)很難實(shí)現(xiàn)。第5 章線程安全到第11 章用Android 性能分析工具檢查性能問題將研究圍繞內(nèi)存和線程的常見問題,同時(shí)指出Android 框架如何隨著時(shí)間的推移逐步演化,從而賦予開發(fā)人員更多的控制。同時(shí),這些章節(jié)還展示了Kotlin 的擴(kuò)展和語言特性如何幫助開發(fā)人員更快地編寫更好的應(yīng)用。第12 章利用性能優(yōu)化減少資源消耗將探討使用強(qiáng)大的Android 開發(fā)工具來檢查底層性能和與內(nèi)存相關(guān)的分析,從而能發(fā)現(xiàn)你從未真正了解的問題。這本書將為工程師提供原生Android 開發(fā)中常見任務(wù)的專業(yè)開發(fā)和管理實(shí)現(xiàn)。很多任務(wù)包括一個(gè)現(xiàn)實(shí)問題,然后是用Java 和Kotlin 實(shí)現(xiàn)的相應(yīng)解決方案。需要進(jìn)一步的解釋時(shí),在解決方案后面會(huì)做一個(gè)簡(jiǎn)單的比較,并強(qiáng)調(diào)Kotlin 語言的簡(jiǎn)潔與自然。排版約定本書使用了下述排版約定:斜體(Italic)表示新術(shù)語、URL、電子郵件地址、文件名和擴(kuò)展名。等寬字體(Constant Width)表示程序片段,以及正文中出現(xiàn)的變量、函數(shù)名、數(shù)據(jù)庫(kù)、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字等。加粗等寬字體(constant width bold)表示應(yīng)該由用戶輸入的命令或其他文本。等寬斜體(constant width italic)表示應(yīng)該由用戶輸入的值或根據(jù)上下文確定的值替換的文本。使用代碼示例這本書的補(bǔ)充材料( 代碼示例、練習(xí)等) 可以從https://githubcom/ProgrammingAndroidWithKotlin 下載。如果使用代碼示例時(shí)有技術(shù)問題或遇到其他問題,請(qǐng)通過以下email 聯(lián)系我們:bookquestions@oreillycom。這本書的目的就是要幫助你完成工作。一般來講,你可以在你的程序和文檔中使用這些代碼,不需要聯(lián)系我們來得到許可,除非你直接復(fù)制了大部分的代碼。例如,如果你在編寫一個(gè)程序,使用了本書中的多段代碼,這并不需要得到許可。但是出售或發(fā)行OReilly 書示例代碼則需要得到許可;卮饐栴}時(shí)如果引用了這本書的文字和示例代碼,這不需要得到許可。但是如果你的產(chǎn)品的文檔借用了本書中的大量示例代碼,則需要得到許可。我們希望但不嚴(yán)格要求標(biāo)明引用出處。引用信息通常包括書名、作者、出版商和ISBN。例如Programming Androidwith Kotlin by Pierre-Olivier Laurence, Amanda Hinchman-Dominguez, G BlakeMeike, and Mike Dunn (OReilly) Copyright 2022 Pierre-Olivier Laurence andAmanda Hinchman-Dominguez, 978-1-492-06300-1。如果你認(rèn)為你在使用代碼示例時(shí)超出了合理使用范圍或者上述許可范圍,可以隨時(shí)聯(lián)系我們:permissions@oreillycom。OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。公司獨(dú)有的專家和改革創(chuàng)新者網(wǎng)絡(luò)通過OReilly 書籍、文章以及在線學(xué)習(xí)平臺(tái),分享他們的專業(yè)知識(shí)和實(shí)踐經(jīng)驗(yàn)。OReilly 在線學(xué)習(xí)平臺(tái)按照您的需要提供實(shí)時(shí)培訓(xùn)課程、深入學(xué)習(xí)渠道、交互式編程環(huán)境以及來自O(shè)Reilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請(qǐng)?jiān)L問網(wǎng)站:https://wwworeillycom/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請(qǐng)按照以下地址聯(lián)系出版社。美國(guó):OReilly Media, Inc1005 Gravenstein Highway NorthSebastopol, CA 95472中國(guó):北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司針對(duì)這本書,我們還建有一個(gè)網(wǎng)頁(yè),列出了有關(guān)勘誤、示例和其他信息?梢酝ㄟ^以下地址訪問這個(gè)頁(yè)面:https://oreilly/pak。如果對(duì)這本書有什么意見,或者詢問技術(shù)上的問題,請(qǐng)發(fā)送電子郵件至errata@oreillycomcn。有關(guān)我們的圖書和課程,更多新聞和信息請(qǐng)?jiān)L問我們的網(wǎng)站:http://wwworeillycom。我們的Facebook:http://facebookcom/oreilly。我們的Twitter:http://twittercom/oreillymedia。我們的YouTube:http://youtubecom/oreillymedia。致謝感謝我們的技術(shù)審校Adnan Sozuan 和Andrew Gibel,經(jīng)他們之手,這本書得到了極大的增強(qiáng)和改進(jìn)。還要感謝OReilly 的人員,他們幫助我們團(tuán)結(jié)在一起,給予了我們所需的全部支持,終于將這本書變成現(xiàn)實(shí),尤其是Jeff Bleiel 和Zan McQuade。感謝Roman Elizarov 和Jake Wharton 抽出時(shí)間與我們討論Kotlin 并發(fā)的發(fā)展方向和Android 的底層問題。感謝朋友、家人和同事們的支持。感謝Kotlin 社區(qū),以及花時(shí)間閱讀早期草稿并提供反饋的所有人。最后,這本書謹(jǐn)獻(xiàn)給Mike Dunn:合著者、同事、朋友和父親。我們非常想念他,希望這本書能讓他感到驕傲。
Pierre-Olivier Laurence是法國(guó)巴黎附近Safran Aircraft Engines公司的首席軟件工程師。Amanda Hinchman-Dominguez是Kotlin方面的Google Developer Expert,也是Groupon的Android工程師,活躍在全球Kotlin社區(qū)。G Blake Meike是Couchbase的高級(jí)軟件工程師,著有多本書,包括《Programming Android》。Mike Dunn是Oreilly Media的首席移動(dòng)工程師,也是Oreilly 《Native mobile Development》一書的作者。
目錄
前言 1
第1 章 Kotlin 基礎(chǔ) 9
11 Kotlin 類型系統(tǒng) 10
111 基本類型 10
112 Null 安全性 11
113 Unit 類型 14
114 函數(shù)類型 15
115 泛型 17
12 變量和函數(shù) 17
121 變量 18
122 Lambda 18
123 擴(kuò)展函數(shù) 19
13 類 21
131 類初始化 22
132 屬性 23
133 lateinit 屬性 25
134 懶屬性 27
135 委托 29
136 伴隨對(duì)象 29
137 數(shù)據(jù)類 30
138 枚舉類 32
139 密封類 34
14 可見性修飾符 35
15 小結(jié) 37
第2 章 Kotlin 集合框架 39
21 集合基礎(chǔ)40
211 Java 互操作性 40
212 可變性 41
213 重載操作符 42
214 創(chuàng)建容器 43
22 函數(shù)式編程 45
221 函數(shù)式與過程式編程:簡(jiǎn)單示例 45
222 函數(shù)式Android 47
23 Kotlin 轉(zhuǎn)換函數(shù) 47
231 Boolean 函數(shù) 47
232 Filter 函數(shù) 48
233 Map 49
234 flatMap 51
235 分組 53
236 迭代器與序列 54
24 示例 56
241 問題 56
242 實(shí)現(xiàn) 57
25 小結(jié) 64
第3 章 Android 基礎(chǔ) 65
31 Android 堆棧 65
311 硬件 66
312 內(nèi)核 67
313 系統(tǒng)服務(wù) 67
314 Android 運(yùn)行時(shí)環(huán)境 67
315 應(yīng)用 68
32 Android 應(yīng)用環(huán)境 68
321 意圖和意圖過濾器 69
322 上下文 71
33 Android 應(yīng)用組件:構(gòu)建模塊 75
331 活動(dòng)及相關(guān)特性 75
332 服務(wù) 80
333 內(nèi)容提供者 85
334 廣播接收者 86
34 Android 應(yīng)用架構(gòu) 88
341 MVC:基礎(chǔ) 88
342 部件 89
343 局部模型 90
35 Android 模式 90
351 模型?C 視圖?C 意圖 90
352 模型?C 視圖?C 演示器91
353 模型?C 視圖?C 視圖模型 91
36 小結(jié) 93
第4 章 Android 并發(fā) 95
41 線程安全性 96
411 原子性 97
412 可見性 97
42 Android 線程模型 99
43 丟幀 100
44 內(nèi)存泄漏102
45 管理線程的工具 105
451 Looper/Handler 105
452 Executor 和ExecutorService 108
46 管理任務(wù)的工具 110
461 JobScheduler 111
462 WorkManager 114
47 小結(jié) 115
第5 章 線程安全 117
51 線程問題示例 118
52 不變性條件 120
521 互斥鎖 120
522 線程安全集合 121
53 線程封閉124
54 線程競(jìng)爭(zhēng)124
55 阻塞調(diào)用與非阻塞調(diào)用 125
56 工作隊(duì)列126
57 背壓 128
58 小結(jié) 130
第6 章 使用回調(diào)處理并發(fā) 131
61 購(gòu)買特性示例 132
62 創(chuàng)建應(yīng)用134
621 視圖模型 134
622 視圖 136
623 實(shí)現(xiàn)邏輯 140
624 討論 141
63 線程模型的限制 143
64 小結(jié) 144
第7 章 協(xié)程概念 147
71 到底什么是協(xié)程 147
711 你的第一個(gè)協(xié)程 148
712 async 協(xié)程創(chuàng)建器 151
72 關(guān)于結(jié)構(gòu)化并發(fā) 153
73 結(jié)構(gòu)化并發(fā)中的父?C 子關(guān)系 155
74 CoroutineScope 和CoroutineContext 157
75 掛起函數(shù)164
76 掛起函數(shù)原理 165
77 使用協(xié)程和掛起函數(shù):實(shí)用示例 169
78 不要誤解suspend 修飾符 172
79 小結(jié) 173
第8 章 協(xié)程實(shí)現(xiàn)結(jié)構(gòu)化并發(fā) 175
81 掛起函數(shù)175
811 場(chǎng)景設(shè)置 176
812 使用javautilconcurrentExecutorService 的傳統(tǒng)方法 178
813 回顧HandlerThread181
814 使用掛起函數(shù)和協(xié)程185
815 掛起函數(shù)與線程小結(jié)189
82 取消 190
821 協(xié)程生命周期 190
822 取消協(xié)程 192
823 取消委托給第三方庫(kù)的任務(wù) 195
824 與取消合作的協(xié)程 199
825 delay 是可取消的 201
826 處理取消 202
827 取消原因 203
83 監(jiān)督 206
84 supervisorScope 構(gòu)建器 208
85 并行分解209
86 自動(dòng)取消210
87 異常處理210
871 未處理和公布的異常 211
872 公布異常 213
873 未處理異常 215
88 小結(jié) 218
89 結(jié)語 219
第9 章 通道 221
91 通道概述222
911 會(huì)合通道 224
912 無限通道 228
913 合并通道 229
914 緩沖通道 230
915 通道生產(chǎn)者 231
92 通信順序進(jìn)程 232
921 模型和架構(gòu) 232
922 第一個(gè)實(shí)現(xiàn) 234
923 select 表達(dá)式 239
924 綜合 241
925 扇出和扇入 243
926 性能測(cè)試 244
927 背壓 245
928 與Actor 模型的相似性 246
929 進(jìn)程中順序執(zhí)行 247
9210 結(jié)語 248
93 CSP 中的死鎖 248
94 要點(diǎn)總結(jié)251
95 通道的限制 252
96 熱通道 253
97 小結(jié) 254
第10 章 流 257
101 流簡(jiǎn)介 258
1011 一個(gè)更現(xiàn)實(shí)的例子 259
1012 操作符 261
1013 終端操作符262
102 冷流使用示例 262
1021 用例1:與基于回調(diào)的API 交互 262
1022 用例2:并發(fā)轉(zhuǎn)換值流 268
1023 出錯(cuò)時(shí)會(huì)發(fā)生什么 270
1024 結(jié)語 270
1025 用例3:創(chuàng)建定制操作符 271
1026 用法 273
103 錯(cuò)誤處理 274
1031 try/catch 塊 275
1032 關(guān)注點(diǎn)分離很重要 277
1033 違反異常透明性 278
1034 catch 操作符 279
1035 封裝發(fā)射異常 282
104 用SharedFlow 實(shí)現(xiàn)熱流 285
1041 創(chuàng)建SharedFlow 286
1042 注冊(cè)訂閱者287
1043 向SharedFlow 發(fā)射值 287
1044 使用SharedFlow 傳遞數(shù)據(jù) 288
1045 使用SharedFlow 作為事件總線 294
1046 StateFlow:專用SharedFlow 295
1047 StateFlow 使用示例 296
105 小結(jié) 298
第11 章 用Android 性能分析工具檢查性能問題 299
111 Android Profiler 301
1111 Network Profiler 305
1112 CPU Profiler 311
1113 Energy Profiler 322
1114 Memory Profiler 325
112 用LeakCanary 檢測(cè)內(nèi)存泄漏 330
113 小結(jié) 334
第12 章 利用性能優(yōu)化減少資源消耗 337
121 用ConstraintLayout 得到更扁平的視圖層次結(jié)構(gòu) 338
122 利用可繪制對(duì)象減少編程繪制 342
123 最小化網(wǎng)絡(luò)調(diào)用中的資產(chǎn)負(fù)載 347
124 位圖池和緩存 348
125 減少不必要的工作 349
126 使用靜態(tài)函數(shù) 352
127 使用R8 和ProGuard 實(shí)現(xiàn)縮小和混淆 352
128 小結(jié) 354