天天看點

Android Weekly Notes Issue #226

Android Weekly Issue #226筆記. 本期内容包括: 用Firebase做A/B Test; 用RxJava做動畫; MVP; proguardFiles; RxJava和Android Data Binding的結合; Mockito的更新; Gradle configurations等.

October 9th, 2016

Android Weekly Issue #226

本期内容包括: 用Firebase做A/B Test; 用RxJava做動畫; MVP; proguardFiles; RxJava和Android Data Binding的結合; Mockito的更新; Gradle configurations等.

作者講了如何用Firebase的Remote Config做A/B Test.

動畫基礎

ViewPropertyAnimator 操作View的屬性動畫很容易也很友善.

本文講的内容主要用ViewPropertyAnimatorCompat, 它是通過這個方法獲得的: ViewCompat.animate(targetView).

它是這樣用的:

Completable 是RxJava1.1.1加入的.

作者通過RxJava來做他們的動畫效果.

這在鍊式連接配接多個動畫和其他操作的時候很有用.

關于Android程式的架構, google提供了Android Architecture Blueprints, 其中作者他們合作于MVP & RxJava的sample.

MVP(Model-View-Presenter)模式:

Model: 資料層. 負責與網絡層和資料庫層的邏輯互動.

View: UI層. 顯示資料, 并向Presenter報告使用者行為.

Presenter: 從Model拿資料, 應用到UI層, 管理UI的狀态, 決定要顯示什麼以及響應使用者的行為.

V和P聯系緊密, 是以它們通常會持有對方的引用. 為了給P做單元測試, V是一個抽象的接口. P和對應的V的關系定義在一個<code>Contract</code>接口裡, 這樣可以讓代碼可讀性更好, 更容易發現二者的聯系.

MVP模式 &amp; RxJava在Android Architecture Blueprints裡的應用

Google blueprint的Sample是一個To Do應用. 它讓使用者可以建立, 閱讀, 更新和删除to do task, 也可以過濾顯示. RxJava主要是用來進行一些非主線程的異步操作.

然後作者詳細說明了代碼實作.

Model中用RxJava在本地和網絡取資料.

(他們的單元測試裡是下劃線和駝峰結合的方法命名方式.)

View有一個base接口:

View在<code>onResume()</code>的時候調用Presenter的<code>subscribe()</code>, <code>onPause()</code>的時候調用Presenter的<code>unsubscribe()</code>. 如果View接口的實作不是Fragment或Activity, 而是Android的自定義View, 那麼在<code>onAttachedToWindow()</code>和<code>onDetachedFromWindow()</code>方法裡分别調用這兩個方法.

View的測試是用Espresso寫的.

Presenter也有一個base接口:

View和Model都通過構造函數傳入Presenter, 在Presenter構造裡還要調用View的<code>setPresetner()</code>方法.

每一個Presenter還要暴露一些其他的方法, 對應View中使用者的行為.

MVP模式的缺點:

MVP模式很好地分離了概念, 當然這是好的. 但是當開發很小的app或者隻是做一個原型時, 确實感覺過度設計了. 為了減少所用的接口, 有一些開發者省去了<code>Contract</code>接口類, 也删掉了Presenter的接口.

當把UI的邏輯移到Presenter中時, 它就變成了一個全能的類, 代碼很長. 為了解決這個問題, 可以進一步拆分代碼, 并且記得建立單一職能, 并且可以被單元測試的類.

結論:

Model-View-Controller MVC模式 有兩個主要的缺點: 首先, View持有Controller和Model的引用; 第二, 它沒有把對UI邏輯的操作限制在單一的類裡, 這個職能被Controller和View或者Model共享.

MVP模式解決了這兩個問題: 砍斷了View和Model之間的聯系, 用Presenter來管理所有和View顯示相關的邏輯(handles everything related to the presentation of the View), 并且這個類是很容易被單元測試的.

作者有三個buildTypes: debug, beta, release.

其中beta用了initWith(buildTypes.debug).

他想給不同的type加上不同的proguard files. 讓debug不混淆(<code>-dontobfuscate</code>), beta和release混淆.

結果卻發現beta沒有混淆.

檢視代碼發現<code>proguardFiles</code>其實是将proguard files疊加.

作者找到的解決方式是用<code>setProguardFiles()</code>:

評論區有人指出還可以這樣:

在<code>defaultConfig</code>中:

然後在<code>debug</code>中: 加<code>proguardFile 'proguard-debug.pro</code>, 這樣更簡潔一些.

相關文檔: BuildType.

作者使用例子介紹了如何将RxJava和Android的Data Binding結合起來使用.

因為Kotlin預設類和方法都是final的, 如果你想要繼承, 必須顯式聲明<code>open</code>.

當你想要在測試中Mock一些行為時, Mockito可能會報錯, 因為它無法mock一個final的class/method.

于是你可能要修改源代碼, 加<code>open</code>或者是接口, 僅僅是為了測試.

Mockito 2解決了這個問題: What's new in Mockito 2.

你隻需要在<code>resources/mockito-extensions</code>目錄下建立一個檔案: <code>org.mockito.plugins.MockMaker</code>.

裡面隻包含一行内容:

<code>mock-maker-inline</code>.

這兩篇是關于Droidcon NYC 2016的感想.

Gradle中的configuration是:

模式是<code>configuationName dependencyNotation</code>.

Configuration names由兩部分組成:

可選的字首, 指定build variant, product flavor或者build type.

必需的字尾, 指定scope.

比如在<code>debugCompile</code>中, debug就是一個build type.

<code>compile</code>沒有字首, 就表示它應用到所有的build類型裡.

每一個正常的configuration都有一個相應的unit test版, 比如<code>testCompile</code>, <code>testDebugCompile</code>.

對于功能測試來說是<code>androidTest</code>, 隻有這一種.

Scope

Scope是和configuration應用的階段有關:

annotationProcessor/kapt: 注解處理;

provided/compileOnly: 編譯期;

compile: 編譯 + 執行;

apk: 執行期.

繼承

Configuration可以繼承, 意味着子類包含父類所有包含的項目.

比如<code>testCompile</code>就繼承了<code>compile</code>.

但是注意繼承必須顯式聲明, 并不是由名字看出來的, 比如<code>testAnnotationProcessor</code>沒有繼承<code>annotationProcessor</code>.

利用繼承可以定義單元測試和公共測試的基類, 這樣它們的共享依賴就可以隻聲明一次.

例子代碼, 展示如何結合RxJava和Android data binding.

一個Quick Settings tile, 用于控制動畫的duration scale.

一個關于日期和時間的自動提示輸入框.

一個Android所有權限的清單.

Mockito 2釋出了, 有什麼新東西呢?

Kotlin 1.0.5 EAP (Early Access Program).

android-apt将不會再開發了, 因為它的功能已經被包含進了Android Gradle plugin.

作者: 聖騎士Wind

出處: 部落格園: 聖騎士Wind

Github: https://github.com/mengdd

微信公衆号: 聖騎士Wind

Android Weekly Notes Issue #226