Android Weekly笔记, 本期内容包括: Mockito的扩展; ConstraintLayout的链式约束; Kotlin的Async-Await; RxJava2.0; 屏幕旋转导致的Activity重建; Throwable类的设计问题; Espresso测试中如何等待异步请求返回; Kotlin的扩展和运算符重载; Android KeyStore实现用户验证.
代码部分有proguard的库, mvp的库和WifiManager, ConfigurationManager的包装库.
November 6th, 2016
Android Weekly Issue #230.
这篇文章讲了如何扩展Mockito, 简化对参数的验证.
首先作者举了之前验证参数的例子, 用的是ArgumentCaptor, 写起来很麻烦, 用了自定义的matcher之后简化了很多.
上一篇文章讲过在ConstraintLayout中如何创建对称的链式约束, 本篇文章介绍chainStyle的不同设置和比较.
默认的spread chain: 均匀分布;
inside spread chain: 边缘元素顶边, 中间均匀分布.
如果指定了权重, 将会按照权重布局. 那么spread chain和inside spread chain就没有区别了.
packed chain: 默认会把所有元素都放在一起放在中间, 可以指定bias来定义偏移基准, 默认bias是0.5, bias设置为0.25的意思就是往左偏.
Kotlin 1.1推出了coroutines, 这是一个让计算可以在某个点暂停然后之后又恢复的功能, 例子是几年前C#的Async-Await.
作者先举例说明了异步操作的几种常见实现, 最后结合自己的库用Async-Await做了一个例子.
RxJava2.0.0已经发布了. 这是它的wiki page来介绍2.0有什么不同.
本篇文章讲configuration变化(比如屏幕旋转)导致的Activity重建.
为什么configuration变化的时候要重建Activity呢? 因为系统想要尽力地做一些helpful的事情, 希望在这种时候能重新加载正确的资源.
怎么处理呢?
方法一: 让系统自动处理. 在屏幕旋转时, <code>onSaveInstanceState()</code>会在Activity销毁前调用, 可以存储一些状态, 之后重建的时候从bundle中拿出来恢复.
方法二: 自己处理. 如果你想要获取更多控制, 那么你可以在manifest中声明<code>configChanges</code>类型, 然后在Activity中覆写<code>onConfigurationChanged()</code>方法, 来自己做处理.
另外文章中还讨论了网络请求, 屏幕方向设置, retained fragment的使用等.
作者讨论了他们在项目中遇到的一个问题.
他们用<code>RxJavaHooks.enableAssemblyTracking();</code>来收集RxJava崩溃栈信息, 可以显示出到底是哪一个Observable崩了.
使用这个工具以后发现了一个问题, 进而研究了JDK的<code>Throwable</code>类.
原来cause不存在(this)和cause未知(null)是两种不同的情况, 但是<code>Throwable</code>的<code>getCause()</code>方法都会返回null.
用Espresso做测试, 如何等待网络请求结束再验证UI.
结合Kotlin的extensions和operator overloading功能, 改善function, 让代码变得更优雅.
一个例子, 说明为什么老的验证方法用户体验不好, 我们如何在仍然考虑用户安全的情况下进行改善.
解决方案是用Android 6.0推出的Android Keystore.
作者展示了如何实现并提供了Demo.
Material Design app需要避免的8个点.
使用一行就可以加上所有流行库的proguard.
一个MVP的库.
包装了Android的WifiManager和ConnectivityManager的一个库.
Droidcon NYC 2016
所有Droidcon NYC 2016的视频资源.
作者: 圣骑士Wind
出处: 博客园: 圣骑士Wind
Github: https://github.com/mengdd
微信公众号: 圣骑士Wind
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5CO1IzXhR2YkBTO2QWZyUGMfh2ZfJ3bm9VZk92YyF3NzkTN1AjMyQDMwIzXv9CX5MTN5YDOvwFZkdmbl12Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)