Android Weekly Issue #318

July 15th, 2018

Android Weekly Issue #318

本期内容包括: Android Navigation Component结合NavigationViewBottomNavigationView; 建议build多个modules到一个大aar; 应用例子说明UI层构建; Realm代码迁移到Kotlin; MVI模式的用法; Facebook和Twitter的sdk集成实现;

Kotlin中的scope functions; Google的机器学习例子网站: Seedbank; 用Kotlin SDL包装一个Java Builder.

ARTICLES & TUTORIALS

Android Jetpack - NavigationUI

Jetpack中的Navigation Component可以帮助我们做Fragment间的导航转换, 从而减少一些样板代码.

本文介绍NavigationView BottomNavigationView结合navigation graph的用法.

Why We Need “fat” AARs for Android Libraries

作者希望能够用多个modules创建一个aar.

这样既有利于开发时候的业务分层, 也能够提供一个整体的第三方库.

这是作者提出的issue: https://issuetracker.google.com/issues/62121508

本文主要说明他需要这样做的理由.

Maintainable Architecture – UI Layer

一个天气应用的UI层设计.

(Kotlin, dagger).

Migrating your Realm to Kotlin

作者他们要把自己的Android应用迁移到Kotlin, 本文讨论了其中数据层迁移中(Realm相关)发现的一些问题.

Model-View-Intent & Data Binding

作者以一个登录界面为例, 讲述Model-View-Intent模式的用法.

使用了这个MVI的library: mosby.

文中例子用Kotlin实现, 结合MVI和Data Binding.

Social Network Integration on Android

Facebook和Twitter的SDK集成, 实现登录和分享功能.

Kotlin Demystified: What are 'scope functions' and why are they special?

Kotlin的"scope functions"是允许改变变量scope的函数.

Kotlin的标准库中有五个: apply, run, with, letalso.

run可以创建一个scope:

fun myFun() {
val outside = 6.2831853071
run {
val inside = 1.61803398875
// Both outside and inside are usable and in scope
}
// inside is out of scope, and only outside is available
}

apply, runwith都有一个有用的特性: 可以用this表示这个调用用到的变量:

class Foo {
//...
myView.run {
// this refers to myView rather than Foo inside the block.
alpha = 0.5f
background = ContextCompat.getDrawable(context, R.drawable.my_drawable)
}
}

如果想用外面的变量, 可以像我们在内部类中做的那样: 用this@Foo.

scope functions也是函数, 需要返回值.

一种是返回接受者, 比如apply.

另一种是返回最后一个语句, 比如runwith.

let工作起来像run, 可以用来做一些不为null的时候的工作:

myIntent?.let {
it.data = data
startActivity(it)
}

其中let的引用对象不是用this, 而是用it.

也可以这样写:

myIntent?.let { intent ->
intent.data = data
startActivity(intent)
}

also工作起来像apply, 也是用it.

可以做一些额外的工作, 比如:

val myListener = Listener().also {
addListener(it)
}

和:

val key: String get() = keystore.getKey(KEY_ID).also {
Log.v(TAG, "Read key at ${System.currentTimeMillis()}")
}

还有一些操作符: forEach, map, filter, 它们实际上也创建了scope, 但是它们也有一些其他的工作, 比如迭代, 映射, 过滤等. Scope functions特殊的地方就在于, 只创建scope, 没有任何其他工作.

关于如何选择, 这里有一个流程图.

如果你想返回对象本身, 那么用applyalso, 如果想返回一个其他结果, 用let, runwith.

Seedbank — discover machine learning examples

Google启动的Seedback是一个机器学习的例子网站, 每一个例子都可以用浏览器查看, 并且可以编辑扩展.

From Java Builders to Kotlin DSLs

DSLs – Domain Specific Languages.

本文讲一个具体的DSL实现: 把一个Java的Builder用Kotlin包装.

作者把这个库MaterialDrawer用Kotlin包装了: MaterialDrawerKt.

LIBRARIES & CODE

android-face-detector

Android实时人脸检测的库, 基于Firebase的ML kit.

UnderlinePageIndicator

配合ViewPager使用的一个indicator, 给tab文字加上下划线, 有滑动动画.

Seedbank

机器学习例子库.

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

  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. 先行发生原则(Happens-before)

    先行发生原则(Happens-Before)是判断数据是否存在竞争.线程是否安全的主要依据. 先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影 ...

  2. 转载:JAVA中获取项目文件路径

    本文转载自:http://blog.163.com/michaelgaoit%40126/blog/static/11389538620103711613620/ web 上运行 1:this.get ...

  3. 96Boards扩展板 STM32 B96B-F446VE 牛刀小试

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...

  4. js:Razor视图下服务器代码给Javascript变量赋值

    namespace Razor.Controllers { public class JSController : Controller { public ActionResult Index() { ...

  5. Python数据结构:列表、元组和字典

    在Python中有三种内建的数据结构——列表list.元组tuple和字典dict 列表中的项目包括在方括号中,项目之间用逗号分割 元组和列表十分类似,只不过元组和字符串一样是不可变的 即你不能修改元 ...

  6. HDU 2255 奔小康赚大钱 KM裸题

    #include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; ...

  7. PowerDesigner将PDM导出生成WORD文档(转)

    今天的温习老知识,是如何将一个PD设计的PDM来导出WORD文档,这是一个非常实用的功能,可以在软件过程的数据库设计文档编写中节省N多时间, 那不废话了,我们就开始今天的讲解吧! 第一步,点击Repo ...

  8. Java实现分布式锁方式

    1.数据库乐观锁 2.redis 3.zookeeper

  9. Ruby on Rails 路由解析

    为了更好的阅读体验.欢迎訪问 作者博客原文 Route是什么 Rails中URL的约定严格基于RESTful风格的.client的请求事实上是在操作一些资源.同一资源的不同的请求动作(GET, POS ...

  10. FZU 2124 FOJ 2124 吃豆人【BFS】

     Problem 2124 吃豆人 Accept: 134    Submit: 575 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...