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. java.lang.Exception: The server rejected the connection: None of the protocols were accepted

    solution for this is from comment for https://issues.jenkins-ci.org/browse/JENKINS-29616. The follow ...

  2. ASP.NET MVC利用ActionLink实现动态组合查询

    一个文件传输数据表,内有日期.传输协议.传输方向(上传或下载).文件名等信息,完整的表内容显示如下: 现在需要分类查询,即按照协议和传输方向查询.单独的分类查询问题并不大,比如,按协议查询,在View ...

  3. 使用NHibernate(6)-- HQL && ICriteria 简单介绍

    1,HQL. HQL是NHibernate特有的查询方式,早先的java语法还没有类似Linq的Jinq,所以Hibernate就弄了一套自己的查询语言,NHibernate移植的时候把这种语言也一块 ...

  4. echart 时间轴、以及y轴值过大但是变化不大显示感觉不出变化的问题+弹出框拖动div事件

    1.时间轴 echart 提供了一种图表,如果x轴是一个时间范围,并且是连续的,如果用传统的数据驱动会很慢,所以用时间轴的方式 function initCurve(_data){ var resul ...

  5. 基于Flume做FTP文件实时同步的windows服务。

    需求:做一个windows服务,实现从ftp服务器实时下载或者更新文件到本地磁盘. 功能挺简单的.直接写个ftp工具类用定时器跑就能搞定,那我为什么不用呢? 别问,问就是我无聊啊,然后研究一下Flum ...

  6. MarkDown编辑使用指南

    MarkDown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 区块元素 标题title # h1 ## h2 ### h3 # ...

  7. ThreadPoolExecutor 异常

    通过execute提交的任务,能将该任务抛出的异常交给未捕获异常处理器处理,而通过submit提交的任务,无论是抛出的未检查异常还是已检查异常,都将被认为是任务返回状态的一部分.如果一个由submit ...

  8. 剑指offer(41-45)编程题

    41.入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. class Solution { public: vector&l ...

  9. 吴恩达《深度学习》第二门课(3)超参数调试、Batch正则化和程序框架

    3.1调试处理 (1)不同超参数调试的优先级是不一样的,如下图中的一些超参数,首先最重要的应该是学习率α(红色圈出),然后是Momentum算法的β.隐藏层单元数.mini-batch size(黄色 ...

  10. Rest客户端

    public class RestClient { public string EndPoint { get; set; } //请求的url地址 public HttpVerb Method { g ...