[Java] 异步case单元测试工具

有时候,需要对一些异步方法进行单元测试(尽管不推荐这样做),传统的assert只能在调用线程抛出AssertException,而测试框架往往只能监测主线程上的AssertException(JUnit),所以需要在主线程上等待异步调用结束,再去assert结果。

利用Java8的CompletableFuture,我们可以很方便地做到这一点,代码如下所示:

使用例子如下所示:

欢迎提出任何建议~

[Gradle] 如何在android项目中对纯Java module使用release/debug build并启用proguard

如何在android项目中对纯Java module使用release/debug build并启用proguard?这里提供一种方法,尽管不是很“好看”,但是可用。

假设app模块依赖lib模块,lib模块是一个纯Java模块(apply plugin: 'java')。整个过程可以分成两步。

引入Proguard

在lib模块的build.gradle里添加以下代码

这里做了几件事情:

  1. 定义proguard task,令jar这个java task依赖于它。即proguard task运行完毕后才运行jar。
  2. 使用文件替换的方式,在jar运行前替换掉class文件。
  3. 通过观察gradle console的输出,得知app在编译时会运行jar task。经过1.2.两步我们可以在正常编译
    流程中插入proguard处理后的class文件。

接下来看怎么样根据debug和release compile关闭或开启proguard

引入debug/release

在lib模块的build.gradle中加入如下代码:

然后在app的build.gradl中加入如下代码:

这段代码做了两个事情:

  1. 监听了task的添加流程,在’preReleaseBuild’和’preDebugBuild’的execute阶段添加了代码逻辑。
  2. 在’preReleaseBuild’和’preDebugBuild’执行完后,执行lib模块中的onRelease或者onDebug方法。

综上,实现了在android项目中对纯Java module使用release/debug build并启用proguard。

注:本文默认读者具有gradle基础知识。
注:附Java Plugin依赖图:
https://i1.wp.com/docs.gradle.org/3.3/userguide/img/javaPluginTasks.png?w=840&ssl=1

[Java] 不依赖Android环境的Java Handler

最近项目中遇到将android project转成java project的需求,要把项目中android相关的部分去掉。其中最纠结的就是如何替换handler。
handler多用于指定线程(Looper)上执行回调,还可以当成一个消息队列使用。通过sendMessageDelayed可以做到事件的延时执行、条件执行和去抖(debouncing)。
于是,我利用Java里面的ScheduledExecutorService写了一个简单的Handler,接口与原Handler基本一致,代码如下所示:

Message类:

Looper类:

Handler类:

使用方法如下所示:

[Android] 如何在 Activity 或者 Fragment 的生命周期结束时停止订阅 Observable

NavUtil

利用 NavUtil,你可以在 Activity 或 Fragment 的生命周期发生变化时,停止订阅你的 Observable。

Usage

在Activity 中,为你的 Observable 应用 compose 操作符,如下所示:

在 Fragment 中的用法如下所示:

目前支持的生命周期事件如下所示:

Gradle

Download

[Android] PermissionUtil

Usage

Gradle

Download

[Android] 在xml中“直接”使用px的小技巧和工具

注:这个idea出自知乎某个回答,但是来源找不到了。。。工具是自己写的。

在项目开发中,UI给过来的设计图上的尺寸标识,一般以px(像素)为单位。Android工程师需根据设计图的尺寸将px换成dp,填到layout.xml中。

有了这个工具,可以很方便地实现这一点。

首先,确认设计图属于下列哪种规格:

然后安装python,运行一个脚本:

然后在控制台中输入:

可得到:

将以上复制到你项目的dimens.xml中,以后可以直接按照设计图的px值,在layout.xml中写@dimen/_**px了。

[Android] PacketParser 二进制协议转换工具

这个工具通过自动生成解析类,实现了字节数组和对象之间的转换。

1. 0.40更新

版本0.40发布,更新内容如下所示:

  1. 支持继承
  2. 支持对象作为字段
  3. 支持条件解析字段
  4. 支持忽略字段
  5. 支持对象List

使用0.40版本,你可以做到:

以TLV格式的数据为例,首先定义一个基类:

再定义一个普通的TLV类:

对于任意一个TLV协议单元,可以定义一个类继承TLVHeaderObject:

留意代码中注释标注出的新特性。

编译项目后,可以通过如下测试:

2. 介绍

2.1. 使用@ParsePacket注解标注实体类

2.2. 框架自动生成解析类 <类名>PacketParser

注:需Builder一次项目,PacketParser才会生成。

2.3. 使用方法

Gradle

packetparser-compiler Download
packetparser-annotation Download