Android Weekly Notes Issue #226
Android Weekly Issue #226
October 9th, 2016
Android Weekly Issue #226
本期內容包括: 用Firebase做A/B Test; 用RxJava做動畫; MVP; proguardFiles; RxJava和Android Data Binding的結合; Mockito的更新; Gradle configurations等.
ARTICLES & TUTORIALS
用Firebase做A/B Test A/B Test your App using Firebase Remote Config
作者講了如何用Firebase的Remote Config做A/B Test.
用RxJava做動畫 Android animations powered by RxJava
動畫基礎
用
ViewPropertyAnimator 操作View的屬性動畫很容易也很方便.
本文講的內容主要用ViewPropertyAnimatorCompat, 它是通過這個方法獲得的: ViewCompat.animate(targetView).
它是這樣用的:
ViewCompat.animate(someButton).scaleX(0f) // Scale to 0 horizontally.scaleY(0f) // Scale to 0 vertically.setDuration(300) // Duration of the animation in milliseconds..withEndAction { removeView(view) } // Called when the animation ends successfully.Completable 是RxJava1.1.1加入的.
作者通過RxJava來做他們的動畫效果.
這在鏈式連接多個動畫和其他操作的時候很有用.
Android Architecture Patterns Part 2: MVP
關于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的關系定義在一個Contract接口里, 這樣可以讓代碼可讀性更好, 更容易發現二者的聯系.
MVP模式 & RxJava在Android Architecture Blueprints里的應用
Google blueprint的Sample是一個To Do應用. 它讓用戶可以創建, 閱讀, 更新和刪除to do task, 也可以過濾顯示. RxJava主要是用來進行一些非主線程的異步操作.
然后作者詳細說明了代碼實現.
Model中用RxJava在本地和網絡取數據.
(他們的單元測試里是下劃線和駝峰結合的方法命名方式.)
View有一個base接口:
public interface BaseView<T> {void setPresenter(T presenter); }View在onResume()的時候調用Presenter的subscribe(), onPause()的時候調用Presenter的unsubscribe(). 如果View接口的實現不是Fragment或Activity, 而是Android的自定義View, 那么在onAttachedToWindow()和onDetachedFromWindow()方法里分別調用這兩個方法.
View的測試是用Espresso寫的.
Presenter也有一個base接口:
public interface BasePresenter {void subscribe();void unsubscribe(); }View和Model都通過構造函數傳入Presenter, 在Presenter構造里還要調用View的setPresetner()方法.
每一個Presenter還要暴露一些其他的方法, 對應View中用戶的行為.
MVP模式的缺點:
MVP模式很好地分離了概念, 當然這是好的. 但是當開發很小的app或者只是做一個原型時, 確實感覺過度設計了. 為了減少所用的接口, 有一些開發者省去了Contract接口類, 也刪掉了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), 并且這個類是很容易被單元測試的.
proguardFiles: A Cautionary Tale
作者有三個buildTypes: debug, beta, release.
其中beta用了initWith(buildTypes.debug).
他想給不同的type加上不同的proguard files. 讓debug不混淆(-dontobfuscate), beta和release混淆.
結果卻發現beta沒有混淆.
查看代碼發現proguardFiles其實是將proguard files疊加.
作者找到的解決方式是用setProguardFiles():
評論區有人指出還可以這樣:
在defaultConfig中:
然后在debug中: 加proguardFile 'proguard-debug.pro, 這樣更簡潔一些.
相關文檔: BuildType.
RxJava meets Android Data Binding
作者使用例子介紹了如何將RxJava和Android的Data Binding結合起來使用.
Mocking Kotlin with Mockito
因為Kotlin默認類和方法都是final的, 如果你想要繼承, 必須顯式聲明open.
當你想要在測試中Mock一些行為時, Mockito可能會報錯, 因為它無法mock一個final的class/method.
于是你可能要修改源代碼, 加open或者是接口, 僅僅是為了測試.
Mockito 2解決了這個問題: What's new in Mockito 2.
你只需要在resources/mockito-extensions目錄下創建一個文件: org.mockito.plugins.MockMaker.
里面只包含一行內容:
mock-maker-inline.
Droidcon NYC 2016 - Victor Nascimento
Droidcon NYC 2016 - Florina Muntenescu
這兩篇是關于Droidcon NYC 2016的感想.
Android Gradle configurations
Gradle中的configuration是:
dependencies {annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'compile 'com.jakewharton:butterknife:8.4.0'compile project(':api')debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4'releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4'androidTestCompile 'com.android.support.test:runner:0.5'testCompile 'org.robolectric:robolectric:3.1.2'testAnnotationProcessor 'org.robolectric:robolectric-processor:3.1.2' }模式是configuationName dependencyNotation.
Configuration names由兩部分組成:
- 可選的前綴, 指定build variant, product flavor或者build type.
- 必需的后綴, 指定scope.
比如在debugCompile中, debug就是一個build type.
compile沒有前綴, 就表示它應用到所有的build類型里.
每一個正常的configuration都有一個相應的unit test版, 比如testCompile, testDebugCompile.
對于功能測試來說是androidTest, 只有這一種.
Scope
Scope是和configuration應用的階段有關:
- annotationProcessor/kapt: 注解處理;
- provided/compileOnly: 編譯期;
- compile: 編譯 + 執行;
- apk: 執行期.
繼承
Configuration可以繼承, 意味著子類包含父類所有包含的項目.
比如testCompile就繼承了compile.
但是注意繼承必須顯式聲明, 并不是由名字看出來的, 比如testAnnotationProcessor沒有繼承annotationProcessor.
利用繼承可以定義單元測試和公共測試的基類, 這樣它們的共享依賴就可以只聲明一次.
configurations {[androidTestCompile, testCompile].each { it.extendsFrom commonTestCompile } }LIBRARIES & CODE
android-data-binding-rxjava
例子代碼, 展示如何結合RxJava和Android data binding.
AnimatorDurationTile
一個Quick Settings tile, 用于控制動畫的duration scale.
DateTimeSeer
一個關于日期和時間的自動提示輸入框.
A list of all Android permissions
一個Android所有權限的列表.
NEWS
What's new in Mockito 2
Mockito 2發布了, 有什么新東西呢?
Kotlin 1.0.5 EAP
Kotlin 1.0.5 EAP (Early Access Program).
What's next for android-apt?
android-apt將不會再開發了, 因為它的功能已經被包含進了Android Gradle plugin.
總結
以上是生活随笔為你收集整理的Android Weekly Notes Issue #226的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为网站文字前面添加图标 在线调用 Fon
- 下一篇: 首部校验和