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()
:
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的更多相关文章
- Android Weekly Notes Issue #230
Android Weekly Notes Issue #230 November 6th, 2016 Android Weekly Issue #230. Android Weekly笔记, 本期内容 ...
- Android Weekly Notes Issue #227
Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...
- Android Weekly Notes Issue #237
Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...
- Android Weekly Notes Issue #229
Android Weekly Issue #229 October 30th, 2016 Android Weekly Issue #229 Android Weekly笔记, 本期内容包括: 性能库 ...
- Android Weekly Notes Issue #221
Android Weekly Issue #221 September 4th, 2016 Android Weekly Issue #221 ARTICLES & TUTORIALS And ...
- Android Weekly Notes Issue #219
Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...
- Android Weekly Notes Issue #236
Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...
- Android Weekly Notes Issue #235
Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...
- Android Weekly Notes Issue #234
Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...
随机推荐
- Struts2日期类型转换
针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...
- 【原】npm 常用命令详解
今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块 ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- API Monitor简介(API监控工具)
API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...
- ABP源码分析三十八: ABP.Web.Api.OData
如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识. API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController,实现了Controll ...
- MySql LIKE 查找带反斜线“\”的记录
解决方法是在反斜线“\前加“\\\”三个反斜杠. SELECT * FROM 表名 AS a WHERE a.字段 \\\\qc0npwqe.3v4', '%') 原理: 写成三个'\'的原因是反斜线 ...
- Redis学习手册(目录)
为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇
上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的.但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的. 之前我们尝试过使用代码生成 ...
- .Net 面试题 3C(CTS,CLS,CLR)
1.CTS(Common Type System)通用类型系统 CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展.任何以.NET平台作为目标的语言必须建立它的数 ...
- xib文件的加载方法
xib文件的加载方法 以UITableViewCell的cell为例 很多时候因为系统的cell无法满足我们的日常需求,我们都会自定义cell 因为cell的界面比较固定,所以通常都会选择用xib来描 ...