反應式編程實戰 使用RxJava 2.x開發Android應用 ( 簡體 字) |
作者:[芬] 蒂莫·圖奧米寧(Timo Tuominen)著 韓義波 譯 | 類別:1. -> 程式設計 -> 手機程式 -> Android |
譯者: |
出版社:清華大學出版社 | 3dWoo書號: 53592 詢問書籍請說出此書號!【有庫存】 NT售價: 590 元 |
出版日:9/1/2020 |
頁數:378 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787302560999 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:有趣的是,在介紹反應式編程之前,我們首先了解一種反應性較弱的平臺:Adobe Flash。在被Adobe收購之前,Macromedia構建了一個名為Flex的成熟框架(后來被稱為Apache Flex)。Flex中的一個重要概念是每個呈現組件的setData函數。setData函數的作用是接收一個數據對象,它完全包含組件需要呈現的信息。盡管一直沒有完全弄清楚如何在原始源和組件預期接收的內容之間轉換數據,但我從年輕時就一直致力于編寫靈活的DirectX C++代碼,這是一個很好的關注點分離。 六年前,由于有了一些平臺,我開始與三星公司合作項目。在這個過程中,我嘗試將我在Futurice公司工作期間學到的Flex相關知識應用到不同的環境中,以獲得不同的結果,但最終產生了更多的概念性問題卻不知道答案。 這一次的任務是在Android上創建一個實時體育應用,其中包含一系列具有不同形式和延遲的數據源。我們經常會收到部分數據,但這些數據只用于更新比賽成績。使用標準工具構建系統似乎非常重要。和經典故事的劇情一樣,我的同事Juha Ristolainen曾經讀過一篇關于RxJava這個新工具的博文。我想我可以試一試。 必須承認的是,掌握RxJava并將其應用到數據處理問題領域是我學習新技術期間印象最深刻的一次經歷。具有諷刺意味的是,第一次經歷是在20年前我學Java編程時。查看RxJava已啟用的功能,就像一次又一次地尋找拼圖中缺失的那些塊,我甚至都沒有意識到這些塊已經丟失。 四年后,事實證明RxJava雖然有明確的概念,但使用起來并不簡單。為了掌握其用法,我的同事Olli Jokinen和我花費了數晚時間,試圖徹底弄明白這種尚未發布的技術。當時RxJava1還處于Beta測試階段。最終,我們解決了代碼中的問題,代碼庫也成為我有幸用過的最出色的一種代碼庫。 你手里拿著的是一本花費數千小時撰寫的書,它會告訴你如何使用RxJava進行Android應用開發。這也是我撰寫這《反應式編程實戰 使用RxJava 2.X開發Android應用》的初衷。
關于本書
RxJava是一個非常強大的工具,你將會通過學習《反應式編程實戰 使用RxJava 2.x開發Android應用》來了解如何使用它創建健壯且可持續的代碼。與傳統的編程方法相比,你將了解思維模式的變化以及這種變化所帶來的影響。 《反應式編程實戰 使用RxJava 2.X開發Android應用》的讀者對象 目前,在幾乎所有Android應用的某些部分中使用了反應式編程工具,即RxJava或另一種反應庫。因此,對于每個Android開發人員來說,深入了解反應式編程很有必要,以備不時之需。 讀者應該對Android平臺有一定的了解,這樣才能從《反應式編程實戰 使用RxJava 2.X開發Android應用》中獲益,讀者也可從示例中學習該平臺的基礎知識。請記住,使用RxJava可以實現一些普通Android應用中并不具備的功能,而這正是《反應式編程實戰 使用RxJava 2.X開發Android應用》的要點所在! 《反應式編程實戰 使用RxJava 2.X開發Android應用》的組織方式:路線圖 《反應式編程實戰 使用RxJava 2.X開發Android應用》分為三個部分。第Ⅰ部分介紹了RxJava,并讓你了解如何在Android平臺上使用它。 ? 第1章介紹RxJava如何使用debounce操作符處理異步事件。 ? 第2章探討如何使用RxJava滿足Android應用的基本網絡需求。 ? 第3章概述事件和變化狀態之間的區別,并介紹了數據處理鏈。 ? 第4章展示如何運用已學到的知識構建一個Flickr客戶端。 ? 第5章深入討論自定義的observable,以及如何使用RxJava構建一個功能完整的文件資源管理器應用來高效地處理多線程。 第Ⅱ部分主要討論視圖模型以及如何使用它們優化數據流。 ? 第6章擴展文件資源管理器應用,并通過將部分業務邏輯分離到視圖模型中來改進體系結構。 ? 第7章進一步開發文件資源管理器應用,添加一個模型作為單一數據源。 ? 第8章以一款井字游戲的示例應用為例說明視圖和視圖模型之間的聯系。 ? 第9章在井字游戲應用中添加一個持久化模型。 ? 第10章展示如何對RxJava代碼進行單元測試,并將某些測試作為示例添加到井字游戲應用中。 第Ⅲ部分深入探討如何使用RxJava構建應用的更高級示例。 ? 第11章使用WebSocket和RxJava構建一個實時聊天客戶端應用。 ? 第12章向聊天客戶端應用添加一個模型,以加載現有消息并支持尚未發布的消息。 ? 第13章使用RxJava創建動態動畫,并快速反應用戶的交互。 ? 作為《反應式編程實戰 使用RxJava 2.X開發Android應用》的結尾,第14章介紹一個應用,它使用開源地圖圖塊在RxJava中完整創建一個可拖動和可縮放的地圖。 關于代碼 《反應式編程實戰 使用RxJava 2.X開發Android應用》包含了許多與普通文本對應的源代碼示例。 在多數情況下,源代碼已經被重新格式化;我們已經添加了換行符,并修改了縮進,以適應書中可用的頁面空間。此外,當在文本中描述代碼時,通常會在代碼清單中刪除源代碼中的注釋。很多代碼清單中都會出現代碼注釋,強調了重要概念。 《反應式編程實戰 使用RxJava 2.X開發Android應用》的所有章節都有完整的在線Android代碼示例。這些示例從簡單的演示到更全面的應用,應有盡有。 可以掃描封底二維碼下載《反應式編程實戰 使用RxJava 2.X開發Android應用》代碼。 關于封面插圖 《反應式編程實戰 使用RxJava 2.X開發Android應用》封面插圖的標題是《1581年阿拉伯婦女的習慣》。這幅插圖取自Thomas Jefferys于1757—1772年在倫敦出版的《古代與現代不同民族的服飾合集》(四卷)。扉頁上注明這些圖畫是手工著色的銅版版畫,用阿拉伯樹膠增加其色彩和透明度。 Thomas Jefferys(1719—1771)被稱為“國王喬治三世的地理學家”。他是一位英國制圖師,是當時主要的地圖供應商。他為政府和其他官方機構繪制和印刷地圖,并制作了各種各樣的商業地圖和地圖冊,特別是北美地區的地圖冊。作為一名地圖繪制師,他對每個地方的調查和繪制激發了人們對當地服飾習俗的興趣,這些服飾在該系列作品中展示得淋漓盡致。18世紀后期,人們對其他國家和旅行的迷戀是一種相對較新的現象,像這樣的作品很受歡迎,它使其他國家的居民能夠了解游客和扶手椅上的旅行者。 Jefferys作品中插圖的多樣性生動地說明了200多年前世界各國的獨特性和個性。從那時起,著裝規范已經發生了變化,并且各個地區和國家豐富的著裝多樣性也逐漸消失了。現在很難區分不同大陸之間的居民。也許,為了樂觀地看待這一問題,我們已經用文化和視覺的多樣性換取了更豐富多彩的個人生活,或者是更多樣化、更有趣的智力和技術生活。 在計算機類書籍不斷涌現的今天,Manning出版社以兩個世紀前豐富多樣的地域生活為基礎來制作圖書封面,借此頌揚計算機行業的創造性和首創精神,而封面中Jefferys的插圖也使讀者對兩個世紀前人們的生活產生了無盡的遐想。 |
內容簡介:《反應式編程實戰 使用RxJava 2.x開發Android應用》首先引導讀者以反應的方式考慮編程和數據。本書詳細介紹了Android中RxJava的核心模式,并解釋了視圖模型。然后探討了備受追捧的應用功能,例如聊天客戶端和巧妙的轉換。最后,讀者將了解與函數式反應式編程(FRP)思維緊密結合的高層設計關注點、架構方法和框架。 主要內容 ● 反應式編程簡介 ● 簡單的線程管理 ● 提高UI反應能力 ● 異步思維方式 ● 構建一個有效的聊天客戶端 |
目錄:第Ⅰ部分反應式核心編程 第1章反應式編程簡介3 1.1你閱讀本書的原因3 1.2不要閱讀本書的情形4 1.3OOP、Rx、FP和FRP5 1.3.1OOP,面向對象編程5 1.3.2FP,函數式編程5 1.3.3FRP,函數反應式編程5 1.3.4Rx,反應式編程5 1.4Rx的特征5 1.5編寫的代碼就是所實現的功能6 1.5.1灰色代碼7 1.5.2反應式編程開發7 1.6反應式總覽8 1.6.1移動開發8 1.6.2Web和HTML59 1.6.3后端系統和Rx9 1.7在開始學習之前你需要知道什么10 1.7.1你需要具備的條件10 1.7.2你不需要具備的條件10 1.8關于本書10 1.8.1在線代碼示例10 1.8.2茶歇11 1.9RxJava2和Android11 1.9.1為什么選擇Java11 1.9.2為什么選擇RxJava11 1.10設置Android環境12 1.10.1GoogleAndroidStudio12 1.10.2Git12 1.10.3RxJava2依賴項12 1.11Java8lambda12 1.11.1什么是lambda函數13 1.11.2剖析lambda函數13 1.11.3lambda函數有什么優點14 1.12深入研究Rx:實時搜索14 1.13項目設置15 1.13.1一種快速實現15 1.13.2基于時間篩選文本更改15 1.14作為數據的emitter的文本輸入15 1.15發布-訂閱模式16 1.16作為observable的文本輸入17 1.17篩選observable18 1.17.1.filter操作符19 1.17.2observable和subscriber的時間解耦20 1.18時間延遲20 1.19延遲時間的優勢21 1.20debounce操作符21 1.21將代碼放入Android系統中23 1.22反應式編程的原理25 1.23事件和彈珠圖26 1.24本章小結26 第2章連接observable29 2.1RxJava和事件流29 2.2subscriber30 2.3RxJava2observable的類型31 2.3.1Observable31 2.3.2Single31 2.3.3Maybe31 2.3.4Completable31 2.3.5Flowable32 2.4訂閱并轉換不同的observable32 2.5當發出正常的網絡請求時會發生什么32 2.6當observable發出網絡請求時會發生什么33 2.7網絡請求作為observable34 2.8示例:RSS提要聚合器35 2.9提要結構36 2.10獲取數據37 2.11combineLatest操作符37 2.12到目前為止的Rx代碼38 2.13異步數據處理鏈40 2.14按順序排列列表42 2.15.map操作符42 2.15.1操作符的有效期43 2.15.2使用.map對列表進行排序43 2.16不變性簡介45 2.16.1不具有不變性的鏈46 2.16.2具有不可變數據的鏈46 2.16.3使用不變性解決問題47 2.16.4Java中的builder47 2.17錯誤處理48 2.17.1網絡錯誤及其處理49 2.17.2當真正的錯誤出現時,該怎么辦50 2.18向客戶端添加更多提要51 2.18.1提要observable列表51 2.18.2細說combineLatest51 2.18.3有多個彈珠的combineLatest52 2.19本章小結53 2.19.1未來展望53 2.19.2從事件到反應式狀態53 第3章建立數據處理鏈55 3.1observable的不同角色55 3.1.1observable事件55 3.1.2反應變量56 3.1.3籃子中橘子的數量56 3.2事件與反應狀態57 3.2.1observable的click事件57 3.2.2開關按鈕57 3.2.3將事件轉換為狀態57 3.2.4作為反應變量的observable58 3.3observable的內部狀態58 3.4箭頭圖和不同的observable類型59 3.5示例:信用卡驗證表單60 3.5.1信用卡驗證器60 3.5.2布局60 3.5.3信用卡卡號的工作原理61 3.5.4按步驟驗證數字62 3.5.5輸入62 3.5.6輸出62 3.5.7解方程式63 3.6第一步:有效期63 3.7信用卡卡號類型和校驗和65 3.7.1卡類型65 3.7.2檢查已知的CardType67 3.7.3計算校驗和67 3.7.4信用卡卡號輸入驗證的大圖68 3.8CVC代碼驗證68 3.9融會貫通70 3.9.1登錄FRP鏈71 3.9.2完整圖71 3.10反應式編程的抽象層次72 3.11RxJava的工作原理74 3.12本章小結75 3.12.1反應圖的優點75 3.12.2表單改進75 第4章通過網絡連接用戶界面77 4.1訂閱解釋77 4.2終止訂閱79 4.2.1已經完成的observable信號79 4.2.2Disposable對象用于取消訂閱80 4.3RxJava2概念和訂閱管理81 4.3.1新subscribe函數簽名81 4.3.2subscribe函數重載81 4.3.3作為subscriber的基本consumer接口82 4.3.4LambdaObserver82 4.4高級Rx鏈示例:Flickr搜索客戶端82 4.5設置Flickr客戶端項目83 4.5.1申請API密鑰83 4.5.2將API放到gradle.properties中84 4.6搜索鏈概述84 4.7步驟1:簡單的硬編碼搜索85 4.7.1搜索API返回的數據類型86 4.7.2搜索并呈現86 4.7.3到目前為止已實現的功能86 4.8click事件87 4.8.1使用onClickListener觸發搜索87 4.8.2使用訂閱88 4.8.3管理訂閱88 4.8.4流式方法88 4.9實現反應鏈90 4.9.1連通數據圖91 4.9.2啟動鏈中的異步操作92 4.10switchMap的工作原理92 4.11獲取縮略圖信息94 4.12步驟1:將列表擴展為一個observable95 4.12.1flatMap操作符95 4.12.2Observable.merge95 4.12.3在嵌套的observable中使用merge96 4.12.4flatMap97 4.12.5使用flatMap擴展列表97 4.12.6代碼中的內容97 4.13步驟2:分別對每一項應用操作98 4.14步驟3:收集結果98 4.15完整的解決方案99 4.15.1圖中間的關鍵代碼100 4.15.2組合代碼100 4.16添加來自其他API的用戶名101 4.17本章小結102 第5章高級RxJava105 5.1深入了解observable和subject105 5.2示例:文件瀏覽器106 5.3文件瀏覽器應用的用戶流107 5.4獲取目錄的文件列表108 5.4.1返回目錄內容列表的函數109 5.4.2Android權限109 5.4.3使用Observable.create創建自定義observable109 5.4.4將文件listing函數封裝到FileListingObservable中110 5.4.5文件列表observable的生命周期111 5.5線程基礎112 5.5.1什么是線程112 5.5.2尚未解決的問題113 5.5.3具有輸入和輸出功能的函數113 5.6函數式編程中的線程114 5.6.1反應式函數鏈114 5.6.2顯示有副作用的結果115 5.7使用getFileListingObservable更改線程115 5.7.1線程更改115 5.7.2使用observeOn更改線程116 5.7.3使用subscribeOn更改線程117 5.7.4在代碼中使用subscribeOn118 5.8使文件列表動態化118 5.8.1切換到fileObservable作為源119 5.8.2形成完整的鏈119 5.8.3Observable.just119 5.9列表click事件120 5.10subject的不同類型121 5.10.1PublishSubject122 5.10.2BehaviorSubject122 5.11使用subject作為FileObservable123 5.12添加PREVIOUS和ROOT按鈕126 5.13PREVIOUS和ROOT的擴展圖126 5.13.1對兩個新按鈕進行編碼127 5.13.2第一個版本準備好了128 5.14更清晰observable的改進版本128 5.15PREVIOUS按鈕129 5.16融會貫通130 5.17詳細圖131 5.18到目前為止的完整代碼131 5.19保存并釋放訂閱133 5.20關于subject的最后說明135 5.21本章小結136 第Ⅱ部分RxJava中的架構 第6章反應式視圖模型141 6.1視圖層141 6.1.1視圖142 6.1.2視圖和文件瀏覽器142 6.2平臺容器143 6.2.1平臺容器的特征143 6.2.2平臺容器的生命周期143 6.3視圖模型144 6.4視圖模型的藍圖146 6.4.1視圖模型的特征147 6.4.2將現有代碼遷移到視圖模型中147 6.4.3獲取視圖模型中的外部數據148 6.4.4視圖模型的完整構造函數149 6.5連接視圖和視圖模型150 6.5.1設置視圖和視圖模型150 6.5.2顯示視圖模型的輸出151 6.5.3將視圖模型綁定到視圖151 6.6全貌153 6.7視圖模型生命周期154 6.7.1在視圖模型中保存訂閱154 6.7.2視圖模型的代碼154 6.8視圖模型和Android生命周期157 6.8.1視圖模型Subscribe/Unsubscribe157 6.8.2視圖模型到視圖綁定157 6.8.3改進的視圖模型生命周期158 6.8.4全貌158 6.8.5Android上的視圖模型階段159 6.8.6onResume和onPause的代碼160 6.9代碼的視圖關聯性161 6.10本章小結162 第7章反應式架構163 7.1反應式架構基礎163 7.2模型-視圖-視圖模型164 7.2.1拆分類164 7.2.2模型的內部關系165 7.2.3所說的數據庫是真實的數據庫嗎165 7.3反應模型166 7.3.1作為實體存儲庫的Web服務器166 7.3.2Web請求流程166 7.3.3Web服務器的模型167 7.3.4模型在哪里168 7.3.5實體存儲庫的模型168 7.4從模型中檢索數據169 7.5修改文件瀏覽器171 7.6構建文件瀏覽器的模型172 7.6.1現有的文件瀏覽器視圖模型172 7.6.2將狀態從視圖模型移入模型173 7.6.3FileBrowser模型實現174 7.7使用模型175 7.7.1創建模型175 7.7.2更新視圖模型中的模型176 7.7.3從視圖模型中刪除邏輯176 7.8模型及其使用者的規則177 7.8.1模型是事實的唯一來源177 7.8.2模型首先提供最新值177 7.8.3模型的所有使用者都必須準備好接收更新177 7.9事實的唯一來源178 7.9.1模型是應用的維基百科178 7.9.2使用顯式緩存的好處180 7.10持久化應用狀態180 7.10.1原子狀態181 7.10.2保存模型狀態181 7.10.3保存模型狀態的代碼182 7.10.4啟動時加載模型狀態183 7.10.5加載模型狀態的代碼184 7.11BehaviorSubject和存儲184 7.12簡單的SharedPreferencesStore185 7.13本章小結186 7.13.1作為事實來源的模型187 7.13.2反應式架構的其他部分187 第8章使用視圖模型進行開發189 8.1視圖模型和視圖189 8.2示例:井字游戲190 8.3繪制游戲網格191 8.3.1draw函數192 8.3.2嘗試使用具有硬編碼值的視圖193 8.4使其具有交互性194 8.4.1反應式處理鏈195 8.4.2網格坐標解析代碼195 8.4.3解析網格位置的代碼196 8.4.4擴展的圖結構197 8.5事件與反應狀態198 8.5.1劃清事件和狀態之間的界限198 8.5.2不同observable的示例199 8.6不可變數據和游戲網格200 8.6.1復制網格201 8.6.2更改GameGrid201 8.6.3Java中的變量引用和原始數據類型201 8.6.4GameGrid類型和setter函數203 8.7添加交互代碼203 8.7.1準備工作203 8.7.2基于事件更新GameGrid204 8.7.3包含.withLatestFrom的循環圖205 8.8將邏輯封裝到視圖模型中210 8.9使用click事件進行坐標處理212 8.10更改回合213 8.10.1連接多個視圖模型輸出214 8.10.2改進的網格數據類型215 8.10.3更新playerInTurn-Observable215 8.10.4在圖中插入玩家回合216 8.10.5GameState結構217 8.11過濾非法動作219 8.11.1阻止非空圖塊219 8.11.2使用pair臨時捆綁數據220 8.11.3向GameViewModel添加過濾220 8.12獲勝條件221 8.12.1確定GameState的代碼222 8.12.2生成getWinner函數222 8.12.3在UI中顯示GameState223 8.12.4視圖綁定代碼224 8.12.5游戲結束后過濾所有動作225 8.13還有一件事:重新啟動游戲225 8.14本章小結226 第9章擴展現有的Rx應用229 9.1使用現有的反應代碼229 9.2四子棋游戲230 9.3更新網格尺寸和資源230 9.3.1資源和繪圖231 9.3.2黑色和紅色231 9.3.3放置標記231 9.3.4井字游戲反應圖232 9.3.5把井字游戲圖改為四子棋游戲圖232 9.3.6在四子棋游戲中放入標記233 9.3.7dropping函數的代碼234 9.4檢查有效動作235 9.4.1允許的動作235 9.4.2更新的事件處理鏈237 9.4.3回顧事件處理中的步驟238 9.5保存并加載游戲240 9.6創建模型240 9.6.1原始圖241 9.6.2將GameState移到模型中241 9.6.3GameModel代碼242 9.7共享模型243 9.7.1“保持簡單”的版本243 9.7.2擴展過于簡單的版本244 9.7.3更新反應方式244 9.7.4存儲和observable246 9.8加載游戲活動247 9.9PersistedGameStore248 9.10保存游戲250 9.11加載游戲251 9.12本章小結252 第10章測試反應代碼253 10.1反應式架構和測試253 10.2測試粒度254 10.3依賴項金字塔結構254 10.3.1測試的類型255 10.3.2應用中的外部因素256 10.4單元測試基礎256 10.4.1布置、動作、斷言256 10.4.2什么是測試256 10.4.3單元測試的代碼示例256 10.5測試反應鏈257 10.5.1為RxJava和Mockito設置測試258 10.5.2測試自定義的observable258 10.5.3介紹testsubscriber258 10.6TestObservable類259 10.6.1檢查終止259 10.6.2檢查輸出的值259 10.6.3測試observable的列表排序259 10.6.4測試異步代碼260 10.7同步或者異步260 10.7.1嘗試測試一個行為異常的函數260 10.7.2測試單線程RxJava函數261 10.8編寫視圖模型的測試264 10.8.1四子棋游戲視圖模型264 10.8.2GameViewModel輸入的作用264 10.9選擇測試什么265 10.10測試GameViewModel初始狀態266 10.10.1設置測試用例266 10.10.2第一個視圖模型測試用例267 10.11測試部分observable鏈268 10.11.1提取鏈269 10.11.2作為靜態函數的部分反應鏈269 10.12測試四子棋游戲放置邏輯270 10.12.1放置邏輯的測試用例270 10.12.2模擬依賴項271 10.13本章小結272 第Ⅲ部分高級RxJava架構 第11章高級架構聊天客戶端1275 11.1使用WebSocket的聊天客戶端275 11.2如何傳輸消息276 11.3WebSocket276 11.4作為廣播者的WebSocket277 11.5連接到服務器278 11.6ChatMessage結構280 11.7發送ChatMessage281 11.7.1消息數據流281 11.7.2發送ChatMessage時的錯誤282 11.7.3運行應用282 11.8將監聽器包裝到observable中283 11.8.1包含Observable.create的監聽器283 11.8.2取消訂閱時釋放監聽器283 11.9基本UI285 11.10顯示消息287 11.10.1繪制視圖模型和視圖287 11.10.2創建ArrayAdapter287 11.11視圖模型288 11.11.1設置289 11.11.2初步實現289 11.12累加ChatMessage290 11.13整合消息處理291 11.14使用視圖模型中的值293 11.15視圖模型生命周期293 11.16創建視圖模型生命周期294 11.16.1使視圖模型了解其訂閱294 11.16.2Subscribe和Unsubscribe方法295 11.17本章小結295 11.17.1取消訂閱時的清理296 11.17.2視圖模型和架構296 第12章高級架構聊天客戶端2297 12.1視圖模型、存儲和模型297 12.1.1聊天客戶端概述297 12.1.2聊天客戶端架構298 12.2消息掛起狀態299 12.3處理狀態更新300 12.4作為aggregator的存儲300 12.4.1aggregator是存儲嗎301 12.4.2將aggregator切換到存儲301 12.5存儲的代碼302 12.5.1解析器的故事303 12.5.2最初的存儲實現303 12.5.3更新的視圖模型303 12.5.4更新的Activity代碼304 12.6實現掛起的消息307 12.6.1呈現掛起狀態307 12.6.2聊天消息format函數308 12.7用確認的消息替換掛起的消息308 12.7.1消息ID309 12.7.2消息更新流程309 12.8更新存儲代碼310 12.8.1使用映射避免重復310 12.8.2對映射進行編碼311 12.8.3副作用:消息順序311 12.9掛起狀態的處理代碼311 12.10模型314 12.10.1作為容器的數據層314 12.10.2簡化的高級架構315 12.10.3頻譜中的模型315 12.11模型的代碼316 12.12模型生命周期317 12.13單例模塊318 12.14用于生產的Android工具320 12.14.1Dagger320 12.14.2Subject320 12.14.3意外終止observable320 12.14.4聲明錯誤處理程序321 12.14.5日志記錄和線程321 12.14.6存儲321 12.15本章小結321 12.15.1視圖模型321 12.15.2模型322 12.15.3表示器322 第13章Rx轉換323 13.1狀態之間的轉換323 13.1.1“即發即棄”策略324 13.1.2小故障324 13.2應該是怎樣的325 13.2.1更復雜的場景326 13.2.2UI狀態不是真或假326 13.3使用一個數字的動畫進度327 13.4反應參數化328 13.5示例:風扇小部件329 13.6設置子視圖的轉換330 13.6.1每個子視圖的總旋轉角度330 13.6.2設置旋轉中心331 13.7使用RxJava和Android進行動畫處理333 13.8更改FanView的代碼334 13.9視圖模型336 13.9.1連接視圖模型和視圖336 13.9.2視圖模型輸入和輸出336 13.10視圖模型邏輯337 13.11在視圖模型中激活參數化的值339 13.12animateTo操作符340 13.13Android上的animateTo操作符342 13.14添加暗淡的背景343 13.15本章小結345 13.15.1動畫和視圖模型345 13.15.2接下來的內容346 第14章創建地圖客戶端347 14.1地圖示例347 14.1.1為什么使用地圖347 14.1.2地圖繪制基礎348 14.2地圖圖塊入門348 14.2.1通向世界的窗口348 14.2.2合并網格和窗口349 14.2.3繪制空圖塊需要哪些數據350 14.3創建初始視圖模型351 14.4根據縮放級別計算圖塊352 14.4.1計算縮放級別的所有圖塊353 14.4.2移動地圖圖塊354 14.4.3地圖偏移量354 14.5使用偏移量移動圖塊355 14.6拖動地圖356 14.6.1拖動和反應357 14.6.2使用xyMovementEvents更新偏移量358 14.7到目前為止的代碼359 14.8Viewport和隱藏圖塊359 14.8.1計算可見圖塊的矩形360 14.8.2插入可見的圖塊361 14.9加載地圖圖塊361 14.9.1下載地圖圖像362 14.9.2地圖圖塊加載程序363 14.10添加縮放級別控件364 14.10.1圖364 14.10.2代碼365 14.10.3縮放級別地圖偏移量限制365 14.11添加對地圖坐標的支持365 14.11.1數學知識366 14.11.2構建lat/lng地圖中心的代碼367 14.12本章小結368 附錄AAndroid開發教程371 |
序: |