Android Weekly Issue #282
November 5th, 2017
Android Weekly Issue #282
本期内容相较上期丰富许多, 技术干货当然也有不少, 如Koin
来替代Dagger应用在Kotlin项目,Grox
做一个面向状态的程序,以及Room实现Relation的介绍,如何解决Architecture Component在Fragment上的漏洞,还有Kotlin Coroutines里面的一些新概念(Actor,Channel等).
当然也包含一些方法论,如将项目转Kotlin的好处及其方法,Java数据结构的基础介绍,伦敦Droidcon大会概况等等.
代码亮点主要在Koin的使用,可以特别关注一下.
ARTICLES & TUTORIALS
Moving from Dagger to Koin
文章介绍了如何用Koin做到一个更Kotlin的依赖注入,与Dagger相比,使用Koin
,无论是你的gradle配置会从很多行缩减到1行,而且你的初始化也将只需要调用startAndroidContext
即刻.
最方便的是可以使用高阶Lambda定义你的Module
,并且在注入的时候不需要写任何的Annotation,可以通过by inject()
的lazy注入方法,或者直接通过primary constructor.
作者还提供了他将google的achitecture里面的Todo Sample用Koin改造后的效果,可以进行学习.
Exploring Firebase Predictions
文章介绍了Firbase的一个alpha阶段的新功能,Prediction
,可以对RemotConfig,A/B Testing,以及Notification Composer进行一些基于机器学习的预测,帮助我们更快的改进产品,提升用户体验.
Architecture Components pitfalls — Part 1
文章介绍了Google的Architecture Components的一个陷阱,虽然ViewModel会在Activity/Fragment销毁时候自动释放,但是在在Fragment使用的时候,很多时候这个Fragment不会销毁而是detach了,而重新attach后又会创建新的Observer,会有内存泄露的风险.
文章指出了好几个Approach来解决这个问题,包括最后一个用了还在试验的Data Binding直接bind我们定义的ViewModel.具体的方法可以查看详情.
Playing with elevation in Android
文章介绍了一些有趣的事情,我们可以通过给View添加OutlineProvider
(Layout#setOutlineProvider)来控制Shadow,但是实际上可以利用elevation
来做到一些效果,Android Material Design系统有两个光源来呈现投影,一个在屏幕最上面向下照射,另外一个在屏幕正中间垂直照射,作者展示了了他的一个项目.
其使用了自定义的CardView,给其添加一个将Outline的大小设置为比Card本身小4dp的Provider,并有4dp的elevation,这样滚动的时候,越往屏幕的下放,影子就越深.
Grox: The Art of the State
文章介绍了一个状态管理的库Grox
,其提供了Command
,Action
,Store
的概念,Command会通过actions()
发射该命令下的不同状态下的Action,并交给store来进行dispatch
,而store会被Grox的静态方法states
封装后将dispatch的Action接收到UI线程来处理UI.
实际上的代码大致是这个样子
1 | states(store).observeOn(mainThread()) |
Canvas : The Real Play Ground!
文章介绍了如何通过通Canvas画一个钟表,挺有意思,可以作为学习draw canvas的一个教程
RadialGradient – Layers
文章通过一个RadialGradient
的view在不同layer上的不同表现来介绍图层以及软硬渲染的概念.
Using the ADS1015 analog to digital converter driver library
开发ADS1015
AD转换器的一个IoT相关的文章,对物联网感兴趣的可以看看.
Adopting Kotlin
文章不是一篇技术偏向的文章,更多的是从各个方面介绍了kotlin的优势,以及作者在将他的项目转到kotlin过程中的一些经验.
Android Architecture Components: Room—-Relationships
文章介绍了Room如何实现外键关联,进行数据库JOIN查找. 除了我们经常用的@ForeignKey
之外,还可以通过@Embedded
与@Relation
来定义外键关系.
Clean App with Kotlin & Architecture Components - Part 2
文章接上次通过Kotlin的Coroutines来做的一个天气应用,这次引入Actor
与Channel
的概念,实际上Actor类似于一个信箱管家,而Channel则是信箱(包括信道),而且具有不同种类型的信道模式,有0缓存的,有无限缓存的,也有固定缓存的,Actor会将定义的数据类型通过Channel发送给接收方,通过Channel不同的类型,可以实现不同的消息循环效果.
Improving performance with background data prefetching
介绍了Instgram如何实现后台预取的,为了让用户的到更好的体验,特别是网络不好地区,他们实现了一套后台Wifi预取的逻辑.间接地,他们也实现了网络与应用使用的解耦,还节省了后台带宽,因为如果没有预取,每次开启程序都要请求主服务器抓取大量数据.
My take from Droidcon London 2017
介绍了作者有幸参加在伦敦举行的Droidcon
大会,分享了在会上听到的诸多Presentation的概况,很多Topic,包括Kotlin Coroutines,Room,Test,Android Security等等.
Practical Data Structures Guide for Android developers
作者在上大学之前就接触了Android开发,但当时没有进行数据结构与算法的系统学习,致使一些基础概念不清晰而有一些不好的习惯.
作者在这里分析了List,Map,Set,Stack等等的数据结构,包含ArrayList与LinkedList的区别,HashMap与LinkedHashMap等等的原理.
不过作者没有讲Android新的SparseArray与ArrayMap的特性.
How “Effective Java” may have influenced the design of Kotlin - Part 3
接着上期介绍的Kotlin的优势,本期介绍了, 总共有5点,包括用by
来做代理实现类的组合,还有Kotlin没有装箱类型带来的好处,等等.
LIBRARIES & CODE
Rings
打不开了…
ads1015
IoT那个AD转换器的代码.
kotlinconf-app
官方的Kolin会议应用,包含很多个版本,当然android版本使用kotlin编写
grox
Android State保持的一个框架,可以将你的程序改成Command/Action驱动的哦.