December 17th, 2017
本期内容主要包括介绍 Kotlin DSL 使用 kotlin 来写 gradle, 如何组织 Session, 以及 MVP 如何通过 LifeCycler 来简化, 如何让多个 presenter 之间相互交互. 特别推荐的有如何使用 kotlin 优化多方法的接口, 有多达四种方法, 是学习 kotlin lambda 优化的好机会, 以及如何使用 kotlin 架构跨平台应用.
代码部分有趣的是一个可以画 dagger 依赖关系的库, 但还支持的不完善, 以及西班牙人封装 Espresso 的一个库, 叫 Barista.
作者分析了自己用 kotlin 写的一个相册应用, 里面用了很多 kotlin 相关的知识.
文章介绍了作者将本来 groovy 的 gradle.build 改成了使用 kotlin.dsl 写的 gradle.build.kts, 做到用 kotlin 来写 gradle, 是不是很嗨森.
教你如何组织公司内部的 session, 首先通过表单收集话题, 然后对话题进行投票, 然后根据话题的多少指定 break, 呵呵, 感觉外国人真的是很天真烂漫~~~
文章用 Firebase Realtime 来讲解如何通过
将程序重构成成 MVVM 架构, 将 Firebase 数据库封装成 LiveData 并放在 ViewModel 里, 这样生命周期与 activity 绑定, 也利于测试.
- Architecture Component
文章介绍了通过解决通过 Notification 打开某 activity, 但后退直接退出而不是回到上一级的用户体验问题. 即通过 TaskStackBuilder 来创建具有 parent activity 的 pending intent. 具体可以看代码, 作者没有提到, 如果在 manifest 里面声明了, 还可以使用 NavUtils 来简化一些流程.
文章介绍了 MVP 的实际应用, 我觉得除了大家所熟知的一些基本思路, 这里有两点值得说道说道.
一是通过 Presenter 订阅 Lifecycle, 可以自动实现 onAttach 与 onDetach.
二是实现一个 Dispatcher, 为所有 presenter 持有. 内部是一个 PublishSubject, 不同 presenter 的方法通过 ofType 监听自己关注的的 state, 不同模块的 presenter 之间通过 publish state 相互通信.
文章介绍了如何使用好的方法在 kotlin 里处理多方法的接口. 并以大家熟知的 Animator.Listener 举例子.
这个四个方法的接口, 如果我们只希望实现一个, 最直接的方法就是使用
, 但是它是一个抽象类, 继承该类就不能继承别的类了.
- AnimatorListenerAdapter
第一种解决方法就是 kotlin 的 interface 支持写 code, 所以自定义的没必要是一个抽象类而还是一个接口, 所有的方法赋值 = Unit 即可.
第二种方法是使用 Exstension, 给
写扩展, 参数是 (Animator)->Unit, 而在内部实现
- ViewPropertyAnimator
, 然后将其回调中的参数通过我们扩展方法的 Lambda 返回, 由于内部套用回调, 为了实现整体扩展方法的 inline, 参数 (Animator)->Unit 需要加 crossinline 标识.
- AnimatorListnerAdapter
- inline fun ViewPropertyAnimator.onAnimationEnd(crossinline continuation: (Animator) -> Unit) {...}
第三种方法是基于第二种, 传入四个 lambda 参数 ((Animator)->Unit), 使用了 named argument 特性, 并都赋默认值 {}, 这样想实现哪个, 就指定名字即可.
第四种使用了
, 或者交
- Lambda with Receiver
, 最 kotlin 的一种封装, 扩展方法 setListener 的参数是
- Extension function lambda
, 而 AnimLisnerHelper 本身实现了所有 Animator 接口的四个方法, 并提供四个方法将 (Animator)->Unit 作为参数保存在 Helper 类内, 代理给之前 override Animator 的四个回调.
- AnimListenerHelper.() -> Unit
- view.animate()
- .setListener {
- onAnimationStart {...}
- onAnimationEnd {...}
- }
文章介绍了使用 kotlin 实现跨平台应用的架构思想, 通过 Kotlin/Jvm,Kotlin/JS, 以及正在 beta 研发阶段的 Kotlin/Native, 可以实现横跨 backend 到所有前端设备的庞大系统, 而整体又基于 MVP 的思想.
由上之下大概的分层是
common (DataModel)
common-platform (平台相关 DomainModel, 使用 Kotlin Multiplatform 的 require/actual)
common-client (MVP 抽象)
common-client-repo-platform (平台相关的 Repo)
views (不同平台的 view 实现)
对于 iOS 与 Android, 又会在 view 之上抽象出来一层为 watch,tv,car,phone 等公用. 叫做
.
- Common Android/iOS Elements
是不是很六百~.
RxJava2 提供了 test observable, 可以通过 Observable.test 进行各种 assert.
画 dagger 依赖图的, 但是还有不少不支持的, 如 Construtor Inject 等等. 在开发中.
很好用的 native 加密库.
封装了 Espresso, 简化了很多 API 的使用.
可以给 View 里面添加方法的一个插件, 如添加一些判断 Visibility 的方法.
一个基于 ConstraintLayout 与 RecyclerView 显示时间线的 View.
给 JSON 解析库 Moshi 写的支持 Kotlin 的库, 不过我查了一下, Moshi 已经有自己的了, 叫 moshi-kotlin.
来源: https://www.cnblogs.com/mengdd/p/android-weekly-notes-issue-288.html