日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Android Weekly Notes Issue #226

發(fā)布時(shí)間:2025/7/14 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Weekly Notes Issue #226 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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():

buildTypes {debug {// ...proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard-debug.pro'}beta {initWith(buildTypes.debug)// ...// New!setProguardFiles([getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'])}release {// ...proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}

評(píng)論區(qū)有人指出還可以這樣:
在defaultConfig中:

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

然后在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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。