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. python学习,day3:函数式编程,局部变量和全局变量

    # coding=utf-8 # Author: RyAn Bi school = 'THU' #全局变量 def change_name(name): global age #在函数中,用globa ...

  2. LOJ2229. 「BJOI2014」想法(随机化)

    题目链接 https://loj.ac/problem/2229 题解 评分标准提示我们可以使用随机化算法. 首先,我们为每一道编号在 \([1, m]\) 以内的题目(这些题目也对应了 \(m\) ...

  3. hiho#1457 重复旋律7 求子串和 后缀自动机

    题目传送门 题意: 给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7. 思路: 对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以 ...

  4. 【性能测试】:JVM内存监控策略的方法,以及监控结果说明

    JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题: [JVM远程监控设置] 1.打开WAS控制台:https://ip:port/ibm/console/login.do 2.进入路径 ...

  5. linux安装oracle 报错[INS-20802] Oracle Net Configuration Assistant failed 解决办法

    [INS-20802] Oracle Net Configuration Assistant failed 首先从LinuxIDC.com下载这个补丁包,然后用 unzip p8670579_1120 ...

  6. (转)aix非计算内存 占用过高 案例一则

    原文:http://www.talkwithtrend.com/Article/28621 两台小型机组成的RAC环境,在用topas查看资源使用情况时,发现一台机器的非计算内存占用过高: MEMOR ...

  7. 3D效果

    3D transform:rotate3d(x,y,z,a) (0.6,1,0.5,45deg) transform-origin 允许改变转换元素的位置,(中心点) transform-style ...

  8. 用table布局和div布局的区别

    table布局的渲染是将整个table全部渲染出来,如果网路不给力的情况下,整个table会卡死在页面div布局的话,页面渲染,会一个一个的div渲染,网页出现会一个一个出来,不管网速怎样,不会全局卡 ...

  9. Java Servlet 缺点

    1.web.xml配置比较多 2.servlet具有容器依赖性(tomcat没有启动,就没有用)

  10. sgu-203 Hyperhuffman(哈夫曼编码)

    Hyperhuffman You might have heard about Huffman encoding - that is the coding system that minimizes ...