Android Weekly Issue #254

April 23rd, 2017
Android Weekly Issue #254
本期内容包括: 如何用Kotlin写一个Gradle Plugin; 使用Kotlin的语法和最佳实践; 如何面试一个Android developer; 如何准备一次演讲; 一个反射的库: Mirror; React Native中的导航实现; Fragments的使用讨论, 使用选择, 以及各种相关的库; Yelp的Android CI系统搭建; 一个Groovy脚本, 用于保存apk和mapping文件.

ARTICLES & TUTORIALS

How to Create Gradle Plugin in Kotlin

关于如何写自定义的gradle插件, 网上有很多教程, 比如官方教程. 但是大多数的教程都是用Groovy写的, 并且只有Hello World.

在这篇文章中, 我们要解决一个真实的问题(把JaCoCo集成到Gradle TestKit中), 并且用Kotlin来写.

开发完成后可以把插件发布到这里: Gradle Plugins, 本文的插件介绍在这里. 具体细节见原文.

Idiomatic Kotlin. Best Practices

为了充分利用Kotlin, 我们需要修改一些在Java中用的最佳实践, 其中很多都可以用Kotlin中提供的更好的特性来取代.

文中的例子很详细, 举了很多个cases, 我们应该把Kotlin当做Kotlin来用, 而不是当做Java来用.

推荐阅读原文.

Interviewing Android Developers

如何面试一个Android开发? 作者分享了他的一些经验和喜欢提的问题.

All You Need is Just a Little Patience

作者分享了他准备演讲的过程.
其中包括他花了多久准备代码, 如何做的Slides, 以及最后的演讲演练.

Mirror: Easy Reflection for Java and Android

作者他们开发了一个叫mirror的库, 用注解的形式来简化反射调用.

Navigation and Styling with React Native

作者之前有一个文章: getting started with React Native, 导航用了Navigator类, 实际上这是一种旧的做法, 新的做法叫做: React Navigation.

关于基础的部分请查看上一篇教程, 本篇介绍Drawer, Stack和Tab三种导航. Demo在这里: react-native-weather.

另外还介绍了库react-native-elementsreact-native-vector-icons的使用.

React Native Elements这个库包含了一系列有用的UI components, 比如按钮, 图标等.

react-native-vector-icons提供了一系列的矢量图, 相比bitmap的优势: 可以指定tint颜色, 拉伸无损, 占用空间小.

关于各类导航的实现见原文的详细介绍.

Fragments: The Solution to (and Cause of) All of Android’s Problems

Context

在Google I/O 2016的这个演讲中: efficiently use fragments, Adam讨论了使用Fragments常见的问题:

  • 复杂的生命周期.
  • Fragment Manager Transactions异步带来的问题.
  • 自定义View还是Fragment?

Adam说如果我们以不同的方式来考虑问题, 上面这些挑战大多都可以被克服:

  • 首先, Fragment只是应用中可组合的入口点. 从抽象层面来看, 和Activity一样.
  • 其次, Fragment不是什么神奇的View. Fragment可以使用View来实现UI, 也可以不使用. 在实践中, Fragment应该响应View中的事件, 但View不应该知道Fragment.

但是在常年的使用中, 开发者也开始寻找不用Fragment的解决方案.

The Rise of Fragment-less Architecture

在2014年, Square发表了这么一篇文章advocating against using Fragments, 讨论了使用Fragment时遇到的种种问题.

除了指出Fragment存在的缺陷, Square还创建了不用Fragment创建应用的工具库: Flow和Mortar.

Flow这个库允许你把你的UI screen用POJO类定义. 一个screen只需要知道和自己关联的View和更新View需要的方法. Flow也提供了基本的导航栈.

如果Flow已经包装了UI, 提供了导航栈,
那么我们的业务逻辑放在哪里呢? 这时候Mortar出现了.

Mortar使用了MVP模式, 把业务逻辑包装在Presenter里, 和View交互. 每一个Presenter都是有scope的, (Thanks to Dagger), 所以presenter销毁的时候资源会被清理. Mortar也提供了对presenter生命周期的管理.

使用这两个库的优点:

  • 没有Fragments.
  • 强制模块化和代码的可测试性. (MVP, DI).
  • 有效利用内存. (Dagger scopes).

但是也有一些缺点:

  • 学习曲线较陡.
  • 很多boilerplate code.
  • 这两个库的release周期都非常长.

Square的blog和库激发了Android社区, 形成了两个团体: 一个是想用设计模式让Fragment更好用; 另一个是再也不用Fragment. 让我们先看一下反对派.

Down With Fragments

用Fragments开发有一个流行的模式是Fragment Navigation Pattern, 即一个Activity多个Fragments的架构. 如果你的应用采取这种架构, 你可以转换回去, 使用多个Activities. 如果你没有采用这种架构, 想摆脱Fragment, 可以考虑使用自定义View来代替.

但是这两种方法都有各自的挑战:
对于转换用Activity来说, 需要额外考虑如何支持平板, 很可能你需要写一些特殊的逻辑或者干脆创建不同的Activity. 使用自定义View, 在UI状态的维护方面又要做更多的努力, 需要自己保存和恢复View的状态, 以及管理backstack.

有一些库是为了解决这些问题而产生的: 比如simple-stack, 一个backstack管理库;
Conductor是一个用来搭建基于View的应用的库.

Long Live Fragments

Square提到过Fragment很难独立测试, 所以后来他们展示了如何从Android生命周期中解耦业务逻辑, 让他们的presenter可测试. 后来Android社区终于开始利用各种设计模式, 写出更整洁和可测试的代码.

关于这些模式的一些资源:

Smarter Fragments

如果因为种种原因, 你还要继续使用Fragments, 我们当然可以做一些事情让它更容易工作, 同时增加可测试性和测试覆盖率. 基本的思想就是通过移动业务逻辑代码, 使它们从android代码中解耦出来, 然后就可以对业务逻辑代码进行单元测试.

此处作者举了一个MVP + Dagger的例子, 代码略.

Continuous Integration on Android

作者分享在Yelp他们是如何构建Continuous Integration (CI)系统的.

A Groovy Script to Save Them All

一个Groovy脚本: deployApks.groovy, 拷贝apk和mapping文件到目标目录, 可以帮助节约不少时间.

LIBRARIES & CODE

Litho

Facebook发布的一个库. Litho使用声明式的API来定义UI组件. 你只需要通过一组输入来描述你的UI布局, framework就会帮你做其他事, 利用代码生成, Litho会执行优化, 同时保持代码简单易用.

TOOLS

How to navigate through your java projects on Github like a boss?

一个Chrome插件, 自动为Github上代码中的类生成超链接, 点击可前往.

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

  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. SVNManager配置

    1.svn与apache的安装 yum install -y subversion httpd   httpd.conf添加如下内容: LoadModule dav_svn_module module ...

  2. 3DES 加密 解密

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...

  3. 【方法】如何限定IP访问Oracle数据库

    [方法]如何限定IP访问Oracle数据库 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知 ...

  4. resin远程调试配置,connection refused问题解决

    http://john521.iteye.com/blog/1879805 这篇博客中讲的很好. 我在配置的过程中遇到了几个问题,记录一下: 1. 调试服务器监听的端口号,百度的开发机都限制了端口在某 ...

  5. java自加和自减

    public class Add { public static void main(String[] args) { int i = 0; i=i++ + ++i; int j = 0; j= ++ ...

  6. setDefaultCloseOperation()参数得使用说明

    System.exit(0)是退出整个程序,如果有多个窗口,全部都销毁退出.setDefaultCloseOperation()是设置用户在此窗体上发起 "close" 时默认执行 ...

  7. webstorm中关于vue的一些问题

    在进行vue开发中,我使用了webstorm,但是过程坎坷艰辛,遇到了很多问题,我将问题和解决方案贴上,以作参考. 1.vue项目部署在webstorm中,第一个遇到的问题是,webstorm卡住了, ...

  8. 20155206 2016-2017-2 《Java程序设计》第5周学习总结

    20155206 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信 ...

  9. 顺序线性表之大整数求和C++

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  10. 【Electron】Electron开发入门(一):开发环境搭建

    刚接触Electron+js开发PC端桌面应用程序的时候,简直一头雾水,搜了网上很多教程,有的要么讲的零零碎碎,要么就是版本太低,很多API语法都不能用了:现在我把一些有用的教程归纳一下,并把目前最新 ...