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