Android Weekly Notes Issue #243
阅读原文时间:2023年07月11日阅读:1

Android Weekly Issue #243

February 5th, 2017

Android Weekly Issue #243

本期内容包括: ConstraintLayout的动画; 用Kotlin写测试; RxJava的练习项目; 一个库: Coordinators的介绍; 一个自动报告Google Play反馈的工具; Service的测试; 动画工具Lottie的介绍; Mutability的讨论;

Nougat的多语言支持和相关的一个有趣的case; 使用StrictMode来发现问题.

ARTICLES & TUTORIALS

作者举例说明了如何在Java代码中动态地改变约束条件, 从而使ConstraintLayout中的View动起来.

如果你想逐渐地迁移代码到Kotlin, 你可以从测试开始, 这样你也不用更改产品环境的代码, 就先熟悉了Kotlin.

本篇文章详细讲了如何setup, 然后写各种测试:

JUnit测试

需要JUnit, mockito-kotlinKluent.

对于在setUp()方法中初始化的变量, 需要标记为lateinit.

Robolectric测试

作者封装了一个基类, 把所有Mockito相关的东东包装在里面. 这样在Mockito升级的时候不用更改每一个测试文件.

Espresso测试

同样, 这里作者也创建了几个基类, 将所有Espresso相关的东东包装起来.

作者建议通过实践来检验和学习RxJava技能, 之前他用过这个Repo: Intro-To-RxJava, 现在他又新推出了这个Repo, 针对RxJava2的.

Square发布了一个库叫coordinators, 这个库是用来分离View中的一些控制逻辑.

作者他们做了一个小项目: Review-Reporter, 可以自动把Google Play上新的用户回复发到slack, firebase, Jira上. 本篇文章讲了他们是怎么做的.

Android官方文档介绍了如何测试Service: Testing your Service. 本文作者介绍他是如何做的.

Lottie是一个iOS, Android和React Native的库, 可以实时渲染After Effects的动画, 让native的应用像使用静态文件一样简单地使用复杂的动画.

An immutable class is a class whose state cannot be changed once it has been created.

这篇文章分享了作者关于Java中的mutability & immutability的一些想法.

Android N的一个新feature就是可以在设置中选择多种语言.

比如一个用户, 她会说意大利语和德语, 她使用的是一个低于Android 7的手机, 她把手机语言设置为意大利语.

有一个app, 支持两种语言, 默认是英语, 然后还支持德语.

但是这个应用在这个用户的手机上打开时, 发现自己并不支持意大利语, 于是会显示英语(默认)而不是德语, 因为应用又不知道这个用户还会德语.

后来用户把手机升级了, 用了Android 7的系统, 她发现可以设置支持多种语言, 于是, 于是她设置了两种语言, 意大利语和德语. 在新手机上装之前那个app的时候发现现在显示的是德语.

因为应用现在知道了用户还会讲德语.

现在, 假设我们需要进行向下兼容以前的旧版本设备, 我们加入了appcompat-v7, 用户更新后, 英语又出现了.

这是因为appcompat-v7中含有一些意大利语的资源, 因为所有的资源在build的时候都会merge到一起, 所以现在app也包含了这些资源. 系统认为现在app能够支持用户的第一语言了, 然后就查找对应的资源, 当然没查找到, 于是就使用了默认资源, 也就是英语.

我们有什么办法可以解决这个问题呢? 答案是这样:

defaultConfig {
  ...

  resConfigs "en", "de"
}

这样就告诉了Gradle我们只支持这两种语言, 所有其他的资源都不会被打包进来.

验证的方法是使用Android Studio的Analyze APK来查看string有多少种configurations.

StrictMode是一个开发工具, 用于发现一些问题, 好让你来修复它们.

一个常用的情景是用来捕捉主线程的IO操作, 避免ANR弹框.

如何使用呢? 很简单, 只需要在应用启动时初始化一下, 可以是你的Application, Activity或其他组件的onCreate()方法:

public void onCreate () {
    if (DEVELOPER_MODE) {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()   // or .detectAll() for all detectable problems
                .penaltyLog()
                .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
    }
    super.onCreate();
}

你可以决定检测到问题时要发生什么, 比如:

  • penaltyDeath(): 整个进程崩溃.
  • penaltyDialog(): 显示Dialog.
  • penaltyLog(): 显示log.

更多的处理见: StrictMode.ThreadPolicy.Builder.

StrictMode文档: StrictMode.

LIBRARIES & CODE

一个Material steppers的库, 类似于配合ViewPager使用的indicators.

Google开放了对support library的bug修改和文档更新.

一个Android的SQLite库, 包含了最新的SQLite版本.

Google Play反馈的自动提示, 支持提示到Slack和Jira.

更简单好用的RecyclerView.

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章