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

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'
} }

评论区有人指出还可以这样:

defaultConfig中:

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

然后在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的更多相关文章

  1. Android Weekly Notes Issue #230

    Android Weekly Notes Issue #230 November 6th, 2016 Android Weekly Issue #230. Android Weekly笔记, 本期内容 ...

  2. Android Weekly Notes Issue #227

    Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...

  3. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  4. Android Weekly Notes Issue #229

    Android Weekly Issue #229 October 30th, 2016 Android Weekly Issue #229 Android Weekly笔记, 本期内容包括: 性能库 ...

  5. Android Weekly Notes Issue #221

    Android Weekly Issue #221 September 4th, 2016 Android Weekly Issue #221 ARTICLES & TUTORIALS And ...

  6. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

  7. Android Weekly Notes Issue #236

    Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...

  8. Android Weekly Notes Issue #235

    Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...

  9. Android Weekly Notes Issue #234

    Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...

随机推荐

  1. 绿色版的Linux.NET——“Jws.Mono”

    Linux.NET环境的搭建,不仅是一项比较耗时的事情,同时也是一项略显复杂繁琐的事情.特别是对于近期的几个Mono版本,由于官方所提供的源码包中出现代码文件的缺失,这总让我们的付出变得徒劳.另外一方 ...

  2. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

  3. 微信小程序开发初探

    一.关于微信小程序 1.1 小程序诞生的背景 张小龙说道: (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西. (2)让创造发挥价值→所 ...

  4. 用Go语言做产品半年的一些感觉

    用Go语言做产品刚好半年,有一些感觉跟大家说道说道. 在使用Go之前,我常常想象,无法使用先进的Debug工具会对工作进度造成多么巨大的影响.甚至在Visual Studio的娇惯下认为,不能调试基本 ...

  5. babel presets stage-x

    在一些新框架的代码中,常基于es6/7标准来书写代码.鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es4/5代码. 以 ...

  6. xcode低版本调试高版本真机系统

    低版本xcode调试本真机高版本系统 //打开此路径把最新的文件拷贝到这里就可以了 /Applications/Xcode.app/Contents/Developer/Platforms/iPhon ...

  7. webpack入门之简单例子跑起来

    webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分割,等到实际需要的时 ...

  8. 学习笔记之(console)

    今天小颖在逛博客园时,发现一位帅锅写的有意思的Console小颖看了后,就自己敲了一遍嘻嘻,为了方便以后查看,小颖把它记录下来嘻嘻,有兴趣的小伙伴也可以自己试试哦. 格式占位符 作用 %s 字符串 % ...

  9. 用Github pages搭建自己制作的网页,方法最简单,适用于新手

    本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建网站的方法,发现不 ...

  10. Win10 连接L2TP VPN 失败解决方法

    Win10 连接L2TP VPN 失败解决方法 iOS系统不知道在什么时候,已经不支持PPTP VPN.偶尔的机会刚好看到github上的一键式VPN服务器部署脚本setup-ipsec-vpn,就在 ...