Android Weekly Notes Issue #258

Android Weekly Issue #258

May 21st, 2017
Android Weekly Issue #258
本期內(nèi)容: 圍繞著Google I/O的熱潮, 本周的posts除了幾篇小工具和軟件設(shè)計(jì)原則的討論, 其他都是在說Android Architecture Components和Kotlin.

ARTICLES & TUTORIALS

DebugPort 2.0

REPL(Read Eval Print Loop)是在命令行界面中, 讀取每一行輸入, 執(zhí)行, 然后輸出結(jié)果, 提供即時(shí)的反饋. Java 9會(huì)提供這么一個(gè)REPL的環(huán)境, 叫JShell.

考慮到在Android中能用上可能要等很長(zhǎng)時(shí)間, 所以作者一年前開始弄了一個(gè)這個(gè)項(xiàng)目: Android-DebugPort.

在你的應(yīng)用中加入這個(gè)依賴, 然后運(yùn)行, 在通知欄就會(huì)彈出通知, 然后在電腦上就可以使用telnet來連接到app.

可以調(diào)用方法, 執(zhí)行腳本, 查詢數(shù)據(jù)庫等.

Understanding Law of Demeter

軟件設(shè)計(jì)要求松耦合.
Law of Demeter, 即迪米特原則, 亦稱為最少知道原則.

文章介紹了在這種原則下應(yīng)該如何設(shè)計(jì)類和它的方法.

Object Oriented Tricks: #6 SLAP your functions

SLAP: Single Level of Abstraction Priciple, 單層抽象原則.

一個(gè)太長(zhǎng)的方法往往有各種缺點(diǎn), 那么怎么判斷一個(gè)方法過長(zhǎng)了呢? 根據(jù)行數(shù)來判斷不太科學(xué), 所以SLAP可以用在這里:
一個(gè)代碼塊中的代碼應(yīng)該處于同一層抽象級(jí)別.

一個(gè)方法不應(yīng)該有幾個(gè)不同級(jí)別的抽象, 換言之, 一個(gè)方法只做一件事.

當(dāng)你在方法代碼中用注釋來分割代碼塊的時(shí)候, 這些代碼可以提取出來, 這樣最初的方法就變成了一個(gè)隱藏實(shí)現(xiàn)細(xì)節(jié), 只展示邏輯步驟的ComposedMethod.

Android and Architecture

Google推出Architecture Components的預(yù)覽, 宣布了一種新的Android App構(gòu)架指導(dǎo).

意見不是處方

寫Android應(yīng)用有多種方式, 這里提供的只是一系列的指導(dǎo)意見, 來幫助你更好地構(gòu)架Android應(yīng)用.

Android framework中有一些定義良好的API, 用于處理和底層系統(tǒng)的交互, 比如Activity, 但是這些是你應(yīng)用的入口點(diǎn), 并不是你的構(gòu)架塊. 這些framework的組件并不強(qiáng)制你分離數(shù)據(jù)和UI, 也不提供清晰的方式來處理獨(dú)立于生命周期的數(shù)據(jù)保存.

Building Blocks

Architecture Components幫助你實(shí)現(xiàn)一個(gè)更明智的架構(gòu), 它們幫助你: 自動(dòng)管理activity和fragment的生命周期, 避免內(nèi)存和資源泄露; 保存Java數(shù)據(jù)對(duì)象到SQLite數(shù)據(jù)庫.

Lifecycle Components

新的lifecycle-aware components提供了一種方式來把你應(yīng)用的核心組件綁定到生命周期事件上, 刪除了顯式的依賴路徑.

這里核心的類是Lifecycle, 它使用了生命周期狀態(tài)和事件(states and events)的枚舉來追蹤相關(guān)組件的生命周期.

LifecycleOwner是一個(gè)接口, 其中getLifecycle()方法返回一個(gè)Lifecycle對(duì)象. LifecycleObserver是一個(gè)觀察者, 可以監(jiān)控組件的生命周期事件(通過在方法上加注解).

LiveData

LiveData
是一個(gè)數(shù)據(jù)持有類, 同時(shí)也是一個(gè)Obervable, 允許它的數(shù)據(jù)被監(jiān)聽, 同時(shí)它也知道生命周期.

當(dāng)你的UI訂閱了底層數(shù)據(jù)的改動(dòng), 并且綁定了一個(gè)LifecycleOwner, LiveData會(huì)確保這個(gè)observer:

  • 在生命周期處于活躍狀態(tài)時(shí)得到數(shù)據(jù)更新.
  • 當(dāng)生命周期結(jié)束時(shí)取消訂閱.
  • LifecycleOwner重新開始時(shí)(比如旋轉(zhuǎn)變化或從back stack中跳出), 得到最新的數(shù)據(jù).

ViewModel

ViewModel是一個(gè)輔助類, 用于盛放Activity或Fragment的UI數(shù)據(jù), 從UI controller的邏輯中分離出view的數(shù)據(jù).

只要Activity/Fragment存在, ViewModel的數(shù)據(jù)就被保持著. 包括Activity/Fragment因?yàn)闋顟B(tài)變化而銷毀重建的情況. 這樣ViewModel就在重建時(shí)提供可用的數(shù)據(jù).

結(jié)合ViewModelLiveData, 就為數(shù)據(jù)提供了一個(gè)了解生命周期的可觀察的容器. 其中LiveData負(fù)責(zé)通知, ViewModel負(fù)責(zé)數(shù)據(jù)保存.

Data Persistence

提出了Room library, 提供了一個(gè)在SQLite之上的object-mapping抽象層, 允許流式的數(shù)據(jù)庫訪問.

Room中三個(gè)主要的組件:

  • Entity: 代碼數(shù)據(jù)庫中一行的數(shù)據(jù), 用帶有注解的Java數(shù)據(jù)類構(gòu)建. 每一個(gè)Entity在它自己的表中被保存.
  • DAO (Data Access Object): 定義了訪問數(shù)據(jù)庫的方法. 使用注解來綁定SQL到每個(gè)方法.
  • Database. 用注解來定義entities列表和數(shù)據(jù)庫版本; 定義DAO的列表; 同時(shí)也是底層數(shù)據(jù)庫連接的主要訪問點(diǎn).

Guide to App Architecture

Guide to App Architecture顯示如何用Architecture Components來構(gòu)建一個(gè)穩(wěn)健的, 模塊化的, 可測(cè)試的app.

Why Kotlin?

作者分享了為什么相比于Java, 他更喜歡Kotlin.

My take on“Architecture Components”

作者分享了他在項(xiàng)目中使用Architecture components的一些心得.

他們的項(xiàng)目原先是MVP + Content Provider的. 為了實(shí)驗(yàn)加入Architecture components, 他又新寫了一個(gè)MVP的Demo項(xiàng)目, 把它轉(zhuǎn)化成MVVM, 又加入Architecture components的新組件來實(shí)現(xiàn). (代碼比較多, 我沒有詳細(xì)看).

ConstraintLayout.com

這個(gè)網(wǎng)站ConstraintLayout.com成立了, 用于討論和ConstraintLayout相關(guān)的一切.

Looking at Room and LiveData - Part 1

Android之前一直沒有提出過一個(gè)官方的構(gòu)架模式, 所以大家總在討論各種MVP, MVVM, MVI模式, 各種庫等等. 終于在Google I/O 2017, Android團(tuán)隊(duì)發(fā)布了Architecture Components, 來提供一個(gè)構(gòu)建Android App的最佳實(shí)踐指導(dǎo).

什么是Architecture Components?

Architecture Components是一系列的庫和指導(dǎo)集合, 作為構(gòu)建Android app的基礎(chǔ). 針對(duì)一些常見的使用場(chǎng)景, 目的是減少樣板和重復(fù)代碼, 讓你能集中精力到你應(yīng)用的核心功能代碼上.

主要組件包括:

  • Room: a SQLite object mapper.
  • LiveData: a lifecycle aware observable.
  • ViewModel: Activity/Fragment和應(yīng)用其他部分的交流點(diǎn).
  • Lifecycle: 核心部分, 包含了組件的生命周期.
  • LifecycleOwner: 核心接口, 用于有生命周期的組件.
  • LifecycleObserver: 當(dāng)某個(gè)生命周期事件發(fā)生的時(shí)候, 應(yīng)該做些什么呢?

之后作者寫了一個(gè)小App作為例子, 用了MVVM + Android Architecture Components. 其中詳細(xì)介紹了Room和LiveData的用法.

Room — Getting Started

一個(gè)簡(jiǎn)單的例子, 介紹如何使用Room. (例子用Kotlin).

Generating Kotlin code with KotlinPoet

Jake Wharton的文章, Square推出了KotlinPoet, 用來生成kotlin代碼.

Why you should totally switch to Kotlin

要轉(zhuǎn)換到Kotlin的若干個(gè)理由. (有17條).

30 New Android Libraries

30個(gè)Android的新庫, 都是自2017年3月份以后發(fā)布的.
作者主觀挑選的, 所以并沒有排序.

列表比較長(zhǎng), 我就不一一列了, 不少庫還是挺有趣的.

LIBRARIES & CODE

android-architecture-counter-sample

使用Kotlin和Android architecture components寫的一個(gè)sample app.

KotlinPoet

Kotlin代碼生成庫.

memechat

Flutter構(gòu)建的一個(gè)聊天應(yīng)用, 用了Firebase, Google Sign in和設(shè)備相機(jī).

News

幾個(gè)大新聞:

  • Android O發(fā)布了第二個(gè)預(yù)覽版.
  • Android team發(fā)布了Architecture Components. - Android正式宣布了支持Kotlin.
  • Instant App現(xiàn)在對(duì)所有開發(fā)者開放
  • Android Studio發(fā)布了3.0 Canary, 推出了一系列的新工具.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容