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; 如果失败, 则用GcmNetworkManagerschedule一个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可以操纵时间, 进行白盒测试.

利用它在测试中可以精确控制时间过去了多少, 我们可以测试在中间的时间点的状态.

值得注意的是它控制的并不是真实的时间, 真实的时间还是立即就度过了的, 所以不会降低测试的速度.

我们也可以利用TestRuleRxJavaPlugins来把这个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的更多相关文章

  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. (二)Audio子系统之new AudioRecord()

    在上一篇文章<(一)Audio子系统之AudioRecord.getMinBufferSize>中已经介绍了AudioRecord如何获取最小缓冲区大小,接下来,继续分析AudioReco ...

  2. SpringMVC初写(六)静态资源设置

    众所周知,SpringMVC的DispatchServlet是不可以以/*规则拦截请求的,否则会将JSP都拦截了,但有时候我们的请求路径是不能有后缀(Resful风格的接口需要),基于上述情况,我们可 ...

  3. mysql exceeded the 'max_questions' resource 记录

    最近Hive Meta的  Mysql 常报错 'user' has exceeded the 'max_questions' resource (current value: 10000) 解决:调 ...

  4. ubuntu下终端路径显示的修改

    环境:ubuntu16.04 ubuntu在默认情况下是显示绝对路径的,进入目录过长的时候让人感觉很不舒服,现在修改成只显示当前目录 vim ~/.bashrc 找到这句 # If this is a ...

  5. 转载:怎么用eclipse开发C++程序(以后备用,待实现),使用CDT

    一:准备工作:需下载以下三个软件包 a).Eclipse 3.1 官方站点: http://www.eclipse.org 工具下载地址:http://www.eclipse.org/download ...

  6. 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 ...

  7. file_get_contents 抓取网页乱码。

    iconv string iconv ( string $in_charset , string $out_charset , string $str ) mb_convert_encoding st ...

  8. Python制作回合制手游外挂简单教程(下)

    引入: 接着上篇的博文,今天我们讲如何实现助人为乐 前期准备: 如何获取图片中指定文字的坐标? 我的思路是截取一个小区域,再根据小区域左上角的坐标获取中央坐标 例如: 获取坐上角的x和y坐标,测量x到 ...

  9. WP的万能小应用时钟表

    哎,只能说现在是越来越不行了,已经近一年没写C#的代码了,我居然隐隐有看不懂自己代码的趋势了,真伤! 我突然想起当年寒假里面为了,准备微软创新杯大赛所做的一些小应用,哈哈,于是我就拿出来显摆一下喽! ...

  10. 实现MySQL数据库的实时备份

    实现MySQL数据库的实时备份 使用MySQL Replication 吴剑 2018-08-03 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian 吴剑 ht ...