Android Weekly Notes Issue #226
Android Weekly Issue #226
October 9th, 2016
Android Weekly Issue #226
本期內(nèi)容包括: 用Firebase做A/B Test; 用RxJava做動(dòng)畫(huà); MVP; proguardFiles; RxJava和Android Data Binding的結(jié)合; 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做動(dòng)畫(huà) Android animations powered by RxJava
動(dòng)畫(huà)基礎(chǔ)
用
ViewPropertyAnimator 操作View的屬性動(dòng)畫(huà)很容易也很方便.
本文講的內(nèi)容主要用ViewPropertyAnimatorCompat, 它是通過(guò)這個(gè)方法獲得的: 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加入的.
作者通過(guò)RxJava來(lái)做他們的動(dòng)畫(huà)效果.
這在鏈?zhǔn)竭B接多個(gè)動(dòng)畫(huà)和其他操作的時(shí)候很有用.
Android Architecture Patterns Part 2: MVP
關(guān)于Android程序的架構(gòu), google提供了Android Architecture Blueprints, 其中作者他們合作于MVP & RxJava的sample.
MVP(Model-View-Presenter)模式:
- Model: 數(shù)據(jù)層. 負(fù)責(zé)與網(wǎng)絡(luò)層和數(shù)據(jù)庫(kù)層的邏輯交互.
- View: UI層. 顯示數(shù)據(jù), 并向Presenter報(bào)告用戶行為.
- Presenter: 從Model拿數(shù)據(jù), 應(yīng)用到UI層, 管理UI的狀態(tài), 決定要顯示什么以及響應(yīng)用戶的行為.
V和P聯(lián)系緊密, 所以它們通常會(huì)持有對(duì)方的引用. 為了給P做單元測(cè)試, V是一個(gè)抽象的接口. P和對(duì)應(yīng)的V的關(guān)系定義在一個(gè)Contract接口里, 這樣可以讓代碼可讀性更好, 更容易發(fā)現(xiàn)二者的聯(lián)系.
MVP模式 & RxJava在Android Architecture Blueprints里的應(yīng)用
Google blueprint的Sample是一個(gè)To Do應(yīng)用. 它讓用戶可以創(chuàng)建, 閱讀, 更新和刪除to do task, 也可以過(guò)濾顯示. RxJava主要是用來(lái)進(jìn)行一些非主線程的異步操作.
然后作者詳細(xì)說(shuō)明了代碼實(shí)現(xiàn).
Model中用RxJava在本地和網(wǎng)絡(luò)取數(shù)據(jù).
(他們的單元測(cè)試?yán)锸窍聞澗€和駝峰結(jié)合的方法命名方式.)
View有一個(gè)base接口:
public interface BaseView<T> {void setPresenter(T presenter); }View在onResume()的時(shí)候調(diào)用Presenter的subscribe(), onPause()的時(shí)候調(diào)用Presenter的unsubscribe(). 如果View接口的實(shí)現(xiàn)不是Fragment或Activity, 而是Android的自定義View, 那么在onAttachedToWindow()和onDetachedFromWindow()方法里分別調(diào)用這兩個(gè)方法.
View的測(cè)試是用Espresso寫(xiě)的.
Presenter也有一個(gè)base接口:
public interface BasePresenter {void subscribe();void unsubscribe(); }View和Model都通過(guò)構(gòu)造函數(shù)傳入Presenter, 在Presenter構(gòu)造里還要調(diào)用View的setPresetner()方法.
每一個(gè)Presenter還要暴露一些其他的方法, 對(duì)應(yīng)View中用戶的行為.
MVP模式的缺點(diǎn):
MVP模式很好地分離了概念, 當(dāng)然這是好的. 但是當(dāng)開(kāi)發(fā)很小的app或者只是做一個(gè)原型時(shí), 確實(shí)感覺(jué)過(guò)度設(shè)計(jì)了. 為了減少所用的接口, 有一些開(kāi)發(fā)者省去了Contract接口類(lèi), 也刪掉了Presenter的接口.
當(dāng)把UI的邏輯移到Presenter中時(shí), 它就變成了一個(gè)全能的類(lèi), 代碼很長(zhǎng). 為了解決這個(gè)問(wèn)題, 可以進(jìn)一步拆分代碼, 并且記得創(chuàng)建單一職能, 并且可以被單元測(cè)試的類(lèi).
結(jié)論:
Model-View-Controller MVC模式 有兩個(gè)主要的缺點(diǎn): 首先, View持有Controller和Model的引用; 第二, 它沒(méi)有把對(duì)UI邏輯的操作限制在單一的類(lèi)里, 這個(gè)職能被Controller和View或者M(jìn)odel共享.
MVP模式解決了這兩個(gè)問(wèn)題: 砍斷了View和Model之間的聯(lián)系, 用Presenter來(lái)管理所有和View顯示相關(guān)的邏輯(handles everything related to the presentation of the View), 并且這個(gè)類(lèi)是很容易被單元測(cè)試的.
proguardFiles: A Cautionary Tale
作者有三個(gè)buildTypes: debug, beta, release.
其中beta用了initWith(buildTypes.debug).
他想給不同的type加上不同的proguard files. 讓debug不混淆(-dontobfuscate), beta和release混淆.
結(jié)果卻發(fā)現(xiàn)beta沒(méi)有混淆.
查看代碼發(fā)現(xiàn)proguardFiles其實(shí)是將proguard files疊加.
作者找到的解決方式是用setProguardFiles():
評(píng)論區(qū)有人指出還可以這樣:
在defaultConfig中:
然后在debug中: 加proguardFile 'proguard-debug.pro, 這樣更簡(jiǎn)潔一些.
相關(guān)文檔: BuildType.
RxJava meets Android Data Binding
作者使用例子介紹了如何將RxJava和Android的Data Binding結(jié)合起來(lái)使用.
Mocking Kotlin with Mockito
因?yàn)镵otlin默認(rèn)類(lèi)和方法都是final的, 如果你想要繼承, 必須顯式聲明open.
當(dāng)你想要在測(cè)試中Mock一些行為時(shí), Mockito可能會(huì)報(bào)錯(cuò), 因?yàn)樗鼰o(wú)法mock一個(gè)final的class/method.
于是你可能要修改源代碼, 加open或者是接口, 僅僅是為了測(cè)試.
Mockito 2解決了這個(gè)問(wèn)題: What's new in Mockito 2.
你只需要在resources/mockito-extensions目錄下創(chuàng)建一個(gè)文件: org.mockito.plugins.MockMaker.
里面只包含一行內(nèi)容:
mock-maker-inline.
Droidcon NYC 2016 - Victor Nascimento
Droidcon NYC 2016 - Florina Muntenescu
這兩篇是關(guān)于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就是一個(gè)build type.
compile沒(méi)有前綴, 就表示它應(yīng)用到所有的build類(lèi)型里.
每一個(gè)正常的configuration都有一個(gè)相應(yīng)的unit test版, 比如testCompile, testDebugCompile.
對(duì)于功能測(cè)試來(lái)說(shuō)是androidTest, 只有這一種.
Scope
Scope是和configuration應(yīng)用的階段有關(guān):
- annotationProcessor/kapt: 注解處理;
- provided/compileOnly: 編譯期;
- compile: 編譯 + 執(zhí)行;
- apk: 執(zhí)行期.
繼承
Configuration可以繼承, 意味著子類(lèi)包含父類(lèi)所有包含的項(xiàng)目.
比如testCompile就繼承了compile.
但是注意繼承必須顯式聲明, 并不是由名字看出來(lái)的, 比如testAnnotationProcessor沒(méi)有繼承annotationProcessor.
利用繼承可以定義單元測(cè)試和公共測(cè)試的基類(lèi), 這樣它們的共享依賴就可以只聲明一次.
configurations {[androidTestCompile, testCompile].each { it.extendsFrom commonTestCompile } }LIBRARIES & CODE
android-data-binding-rxjava
例子代碼, 展示如何結(jié)合RxJava和Android data binding.
AnimatorDurationTile
一個(gè)Quick Settings tile, 用于控制動(dòng)畫(huà)的duration scale.
DateTimeSeer
一個(gè)關(guān)于日期和時(shí)間的自動(dòng)提示輸入框.
A list of all Android permissions
一個(gè)Android所有權(quán)限的列表.
NEWS
What's new in Mockito 2
Mockito 2發(fā)布了, 有什么新東西呢?
Kotlin 1.0.5 EAP
Kotlin 1.0.5 EAP (Early Access Program).
What's next for android-apt?
android-apt將不會(huì)再開(kāi)發(fā)了, 因?yàn)樗墓δ芤呀?jīng)被包含進(jìn)了Android Gradle plugin.
總結(jié)
以上是生活随笔為你收集整理的Android Weekly Notes Issue #226的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为网站文字前面添加图标 在线调用 Fon
- 下一篇: 初次使用Android Studio问题