Android Weekly Issue #257

May 14th, 2017
Android Weekly Issue #257
本期内容包括: Gradle中关于项目的一些设置; Android设备上的各种id讨论; ViewPagerAnimator这个库的进一步介绍; Kotlin中的Nothing类型介绍; 实现Parcelable的类和测试; Android开发中一些提高效率的快捷键.

ARTICLES & TUTORIALS

Make or break… with Gradle

作者讲了他们的一些工作习惯:

  • Git分支管理.

    • 所有向主分支的提交都必须通过Pull Request.
    • 仅在CI通过后才允许merge.
  • Lint设置.
    • build.gradle中的lintOptions设置.
    • ./gradlew check会跑所有的单元测试, UI测试和Lint.
  • 代码分析工具.
  • 生成文档.
    • 用CheckStyle要求所有的public方法都有JavaDoc注释(默认已经实现了).
    • 实现Gradle JavaDoc Plugin.
  • 代码测试率报告.
    • Jacoco.
    • 可以设置一些规则来检测意外打出的log和注释掉的代码(Code Smell).

Identifying an Android Device

在Android设备上可以通过程序获取各种id来识别一个设备或者一次安装. 这篇文章就讨论各种id:

  • 通过Settings.Secure获取到的Android ID.
  • Android Build.SERIAL.
  • Android Build.MODEL.
  • Android Build.BRAND.
  • Android Build.MANUFACTURER.
  • Android Build.DEVICE.
  • Android Build.PRODUCT.
  • IMEI (International Mobile Equipment Identity).
  • Phone Number.
  • ICCID (Sim Serial Number).

ViewPagerAnimator – The Advanced Stuff

上次我们介绍了ViewPagerAnimator这个库, 在ViewPager切换时进行动画, 但是上次只介绍了简单的颜色变化, 本文介绍一些关于API的高级设定: 变化的属性可以是自定义的类型; API的良好设计使得使用的代码在支持Java 8的环境下可以大幅度地得到简化.

Nothing (else) matters in Kotlin

Kotlin中的一切都有一个类型, 甚至还有一个类型叫Nothing.

Kotlin中没有void类型, 当一个方法fun没有显示地声明返回值的时候, 它返回的其实是Unit类型.

Unit是一个真的类型, 继承Any(Any对应Java中的Object), 只接受单个的值, 是一个单例(为了避免每次方法返回Unit之后分配内存).

如果我们有一个方法, 方法中只抛出一个异常, 如果我们不特殊声明, 它的返回值仍是Unit, 但是也许我们应该返回Nothing:

fun fail(): Nothing {
throw RuntimeException("Something went wrong")
}

Nothing是一个无人居住的类型, 在运行时没有值会是这个类型, 它也是其他类的子类.

当作为返回值时, UnitNothing到底有什么区别呢?

举例来说明:

val data: String = intent.getStringExtra("key") ?: fail()
textView.text = data

如果fail()方法返回Nothing, 我们要么得到String, 要么抛出异常; 如果返回Unit, 我们会得到一个error, 以为Unit不能转换为String.

如果不显式声明String类型呢?

val data = intent.getStringExtra("key") ?: fail()
textView.text = data

如果fail()返回Nothing, 类型是String;
如果返回Unit, 类型是Any, 但TextView期待的是一个CharSequence, 所以你仍然会得到一个error.

Nothing的用途就是用来显式地标记一个方法永远也不会成功地完成(它可能会抛出异常, 进入死循环或者导致一个控制流转变).

Nothing?有且仅有一个实例, 是null.
Nothing?是所有nullable类型的子类.

Android Parcelables Made Easy

可以在Android Studio中装一个插件, 来自动生成Parcelable的代码:
Android Studio > Preferences > Plugins > 搜索Parcelable > 安装Android Parcelable Code Generator.

安装之后, 在你的类中, 只需要声明字段, 然后Cmd + N, 选Parcelable就可以生成相关的代码了.

之后, 好的做法是为你的类写一个单元测试, 一旦有人加了新字段, 他们也需要保证Parcelable.
为了让你的测试fail的时候显示的信息更有效, 你还需要覆写toString()方法和equals()方法.(这些都是可以自动生成的).

Android shortcuts and tricks to boost up your productivity!

Android开发中一些提高效率的快捷键:

  • 在Activity和它的布局间切换:

    • 在Activity声明的那一行用鼠标点icon.
    • Cmd + Shift + O 输入文件名.
    • Cmd + Shift + A 输入related symbol. (可以把这个存为一个自定义的shortcut).
  • 在xml的文字和design之间切换: Ctrl + Shift + Left/Right.
  • 扩展/缩减选中文字: Opt + Up/Down.
  • 生成新类: Cmd + N; Opt + Enter.
  • 去实现类: Cmd + Opt + B.
  • 实现一个方法: Opt + Enter; Ctrl + I.
  • 去基类方法: Cmd + U; 去实现类方法: Cmd + B.
  • 覆写基类方法: Ctrl + O.
  • 在子类中给基类加方法: 在子类中把方法标记为@Override, 然后在@Override上按Opt + Enter, 选择Pull method xxx to YYY.
  • 改变方法参数: Cmd + F6.
  • 交换方法参数: Cmd + Opt + Shift + Left/Right.
  • 定位当前文件: 导航烂最左边有一个圆形小按钮可以帮你定位文件, 如果你想要自动, 可以勾选Autoscroll from Source.
  • 把local变量改为成员变量: Cmd + Opt + F.
  • 提取layout和style. (这个快捷键我实验失败了).

LIBRARIES & CODE

litho-glide

为litho创建的Glide图片加载组件.

sample-googleassistant

Google Assistant API sample for Android Things.

Android Weekly Notes Issue #257的更多相关文章

  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. 实例化Spring容器的两种常用方式

    //在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"b ...

  2. Java程序员新手老手都离不开八大开发工具

    以下这8个工具,从代码构建到错误挤压,覆盖Java开发的全域.学习这些工具可以帮助你改善代码质量,成为一个更高效的Java开发人员.Java这个大世界中正在不断涌现新的工具.实用程序和库.如果你的首选 ...

  3. 微信小程序 - gulp插件压缩(代码、图片等)

    最后更新时间: 2018.7.18 :更新了所有package.json插件版本以及修复极个别问题. 2018.8.12 : 增加提示,所有标签必须闭合(不然打包会报错) 2018.10.13:需要用 ...

  4. Android Studio/IntelliJ IDEA使用手记

      使用第三方jar包 1.将jar包放入项目里的libs文件夹中: 2.在project选中该jar包,点击右键选择:"Add as library": 1. 代码中中文显示乱码 ...

  5. x264代码剖析(十三):核心算法之帧间预測函数x264_mb_analyse_inter_*()

    x264代码剖析(十三):核心算法之帧间预測函数x264_mb_analyse_inter_*() 帧间预測是指利用视频时间域相关性,使用临近已编码图像像素预測当前图像的像素,以达到有效去除视频时域冗 ...

  6. 去掉activity默认动画效果的方法

    非常多手机都会自带一些Activity切换动画,项目中假设我们须要禁用掉系统Activity切换的动画.能够使用例如以下方法: 一.重写Activity的Them中的windowAnimationSt ...

  7. 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

    // ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...

  8. 【Selenium + Python】路径报错之OSError: [Errno 22] Invalid argument: './t/report/2018-03-23_11:03:12_report.html'

    现象: 此问题真的是太痛苦了,查了好多资料是说路径的问题,结果还是报错,后来一点点的排查才发现原来是!!!!!! 废话不多说上原来代码: if __name__ == '__main__': star ...

  9. Android 音频 OpenSL ES 录音 采集

    1,; int channelConfig = AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM_1 ...

  10. python 基础 1.5 python数据类型(四)--字典常用方法示例

    一. 字典 #字典 dict1 = {'name':'lzc','age':'20','sex':'man'} print dict1 print type(dict1) >>> { ...