Android Weekly Notes Issue #247
Android Weekly Issue #247
March 5th, 2017
Android Weekly Issue #247.
本期内容包括: 离线模式的实现; RxJava2的测试支持; MVI模式中的单向数据流; FlexboxLayout的使用; 用脚本来配置项目的版本名和版本号; Fragment的转场动画; MVP模式的几点原则;
RxJava中需要注意的一些点; RxJava在Android中的实现例子; JUnit 5使用.
ARTICLES & TUTORIALS
Offline support: “Try again, later”, no more
作者他们的应用很好地处理了离线模式, 他们的基本原则是, 应用中不需要显示任何的loading控件.
在离线装填下, 在用户看来仍是可以提交请求的, 只不过出现了一个sync的小图标, 一旦当用户再次连上网络, 他的请求就会被发送出去.
然后作者讲了他们的程序设计:
首先是MVP结构, 使用了Content Provider包装的SQLite数据库. (此处列举了使用Content Provider的若干优点).
后台的同步工作, 他们选择了GCMNetworkManager
.
基本流程是这样: 但用户提交请求, 首先存储在数据库中, 状态为pending, 然后后台service发送请求, 如果成功, 则更新数据库中的状态为synced; 如果失败, 则用GcmNetworkManager
schedule一个task, 在网络连接恢复时再做一次尝试, 成功和失败的处理同上一步.
Story Code
作者讲了一种方法, 以一种叙事的方式来写一个测试故事, 然后把它分成很多个小的测试cases. 这样可以用来驱动API的设计和其实现等.
Testing RxJava2
本文介绍RxJava2中内置的关于测试的支持.
测试一个Observable
可以用TestObserver
; 测试Flowable
可以用TestSubscriber
.
如何测试在不同线程上的工作?
有几种选择:
- 把Observable变为blocking的. ->
blockingIterable()
, 缺点: 测试慢. - 强制测试等待, 直到某个条件达成. ->
awaitTerminalEvent()
. 此处还推荐一个库: awaitility. - 把schedular换为一个immediate的.
RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());
. 需要最后reset一下, 可以用JUnit的TestRule来进行简化.
用TestScheduler
可以操纵时间, 进行白盒测试.
利用它在测试中可以精确控制时间过去了多少, 我们可以测试在中间的时间点的状态.
值得注意的是它控制的并不是真实的时间, 真实的时间还是立即就度过了的, 所以不会降低测试的速度.
我们也可以利用TestRule
和RxJavaPlugins
来把这个scheduler设置为测试时候要切换成的scheduler.
Syncing Changes
Trello的离线模式实现文章系列之二. 基本的原则是在离线的时候把改动(deltas)存在数据库里, 之后有机会再同步给server.
本文介绍了他们如何计算delta和将它们按时间上传到服务器.
Reactive Apps With MVI - Part 4
MVI系列文章的第四篇. 本篇讲如何构建独立的UI单元.
作者认为Presenter之间的Parent-Child关系是一种code smell, 因为这样引入了一种强耦合的关系, 不好读, 不好维护.
你也许要问那Presenter之间如何通信呢? 答案是, 它们根本就不需要通信, 它们只需要更新和观测同一个Model(可以说业务逻辑), 让底层来通知它们事件的发生就可以了.
Resources for Learning how to Test Android Apps
关于Android测试的相关资源分享.
Unboxing the FlexboxLayout
作者想实现一个动态关键字的流式布局, 可以根据parent的宽度自动换行.
他想了几种方法, 都不太合适, 所以最后选择了FlexboxLayout
.
作者尝试了单独使用FlexboxLayout
和 将FlexboxLayoutManager()
设置为RecyclerView
的Layout Manager两种办法来实现他想要的效果.
Configuring Android Project - Version Name & Code
首先介绍了git-describe命令.
git describe -tags
可以输出当前最近的tag和它之后有几个提交, 还有最新提交的hash.
作者建议使用这个库: grgit, 写一个script-git-version.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.ajoberstar:grgit:1.5.0'
}
}
import org.ajoberstar.grgit.Grgit
ext {
git = Grgit.open(currentDir: projectDir)
gitVersionName = git.describe()
gitVersionCode = git.tag.list().size()
gitVersionCodeTime = git.head().time
}
task printVersion() {
println("Version Name: $gitVersionName")
println("Version Code: $gitVersionCode")
println("Version Code Time: $gitVersionCodeTime")
}
在主文件中apply这个文件.
执行printVersion task后会输出类似这样的信息:
Version Name: 1.0-2-gdca226a
Version Code: 2
Version Code Time: 1484407970
这样使用:
productFlavors {
dev {
versionCode gitVersionCodeTime
versionName gitVersionName
}
prod {
versionCode gitVersionCode
versionName gitVersionName
}
}
这样就自动生成了版本号和版本名.
你还可以进一步设计, 在版本名中包括分支名, 时间戳之类的.
Workcation App - Part 1. Fragment custom transition
作者的系列文章, 讨论他的项目中的动画的实现.
本文是第一篇, 介绍进入map的转场动画.
首先, 在map加载完毕后, 存一个截图放在缓存里, 然后用一个自定义的Transition来做缩放和渐变的动画, 最后把它设置为fragment的转场动画.
Model-View-Presenter: Android guidelines
MVP实现的一些guidelines和最佳实践.
- 1.View要无脑和被动.
- 2.Presenter要和framework无关, 不依赖任何Android的类.
- 3.写一个协议描述View和Presenter的交互.
- 4.定义命名规则来区分职责.
- 5.不要在Presenter里创建生命周期的回调方法.
- 6.Presenter和View是一对一的关系. 可以定义
attach()
和detach()
或start()
和stop()
来关联和解除关联. - 7.不要在Presenter里用Bundle保存状态. 因为不能包含Android的类.
- 8.不要保存Presenter. 因为Presenter并不是一个数据类.
- 9.在Model中提供cache来恢复View的状态.
5 Not So Obvious Things About RxJava
RxJava使用学习中的五点(RxJava1.2.6).
- 什么时候用
map()
或者flatMap()
. - 不使用
Observable.create()
来创建observables. 使用其他更方便的方法, 比如syncOnSubscribe
,fromCallable
,fromEmitter
. - 如何处理Backpressure.
- 如和能让流不因为errors而停下来.
- 如何分享Observable到多个订阅者 ->
share()
或publish()
.
Simplify Concurrency with Reactive Modelling on Android
用RxJava来处理Android上的并发和异步.
作者的文章中举了很详尽的各种例子.
JUnit 5: Getting Started
使用JUnit 5做测试.
本文讲了一些在Android上setup可能会遇到的问题及怎么解决.
LIBRARIES & CODE
FastHub
一个Android的Github客户端.
gradle-android-javafmt-plugin
一个gradle plugin, 自动format代码.
HtmlCompat
Android中Html类的兼容库.
Android Weekly Notes Issue #247的更多相关文章
- 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的使用; ...
随机推荐
- (二)Audio子系统之new AudioRecord()
在上一篇文章<(一)Audio子系统之AudioRecord.getMinBufferSize>中已经介绍了AudioRecord如何获取最小缓冲区大小,接下来,继续分析AudioReco ...
- SpringMVC初写(六)静态资源设置
众所周知,SpringMVC的DispatchServlet是不可以以/*规则拦截请求的,否则会将JSP都拦截了,但有时候我们的请求路径是不能有后缀(Resful风格的接口需要),基于上述情况,我们可 ...
- mysql exceeded the 'max_questions' resource 记录
最近Hive Meta的 Mysql 常报错 'user' has exceeded the 'max_questions' resource (current value: 10000) 解决:调 ...
- ubuntu下终端路径显示的修改
环境:ubuntu16.04 ubuntu在默认情况下是显示绝对路径的,进入目录过长的时候让人感觉很不舒服,现在修改成只显示当前目录 vim ~/.bashrc 找到这句 # If this is a ...
- 转载:怎么用eclipse开发C++程序(以后备用,待实现),使用CDT
一:准备工作:需下载以下三个软件包 a).Eclipse 3.1 官方站点: http://www.eclipse.org 工具下载地址:http://www.eclipse.org/download ...
- PTA (Advanced Level) 1066 Root of AVL Tree
Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of ...
- file_get_contents 抓取网页乱码。
iconv string iconv ( string $in_charset , string $out_charset , string $str ) mb_convert_encoding st ...
- Python制作回合制手游外挂简单教程(下)
引入: 接着上篇的博文,今天我们讲如何实现助人为乐 前期准备: 如何获取图片中指定文字的坐标? 我的思路是截取一个小区域,再根据小区域左上角的坐标获取中央坐标 例如: 获取坐上角的x和y坐标,测量x到 ...
- WP的万能小应用时钟表
哎,只能说现在是越来越不行了,已经近一年没写C#的代码了,我居然隐隐有看不懂自己代码的趋势了,真伤! 我突然想起当年寒假里面为了,准备微软创新杯大赛所做的一些小应用,哈哈,于是我就拿出来显摆一下喽! ...
- 实现MySQL数据库的实时备份
实现MySQL数据库的实时备份 使用MySQL Replication 吴剑 2018-08-03 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian 吴剑 ht ...