Android Weekly Notes Issue #230
November 6th, 2016
Android Weekly Issue #230.
Android Weekly筆記, 本期內(nèi)容包括: Mockito的擴(kuò)展; ConstraintLayout的鏈?zhǔn)郊s束; Kotlin的Async-Await; RxJava2.0; 屏幕旋轉(zhuǎn)導(dǎo)致的Activity重建; Throwable類的設(shè)計(jì)問題; Espresso測(cè)試中如何等待異步請(qǐng)求返回; Kotlin的擴(kuò)展和運(yùn)算符重載; Android KeyStore實(shí)現(xiàn)用戶驗(yàn)證.
代碼部分有proguard的庫(kù), mvp的庫(kù)和WifiManager, ConfigurationManager的包裝庫(kù).
ARTICLES & TUTORIALS
Extending Mockito
這篇文章講了如何擴(kuò)展Mockito, 簡(jiǎn)化對(duì)參數(shù)的驗(yàn)證.
首先作者舉了之前驗(yàn)證參數(shù)的例子, 用的是ArgumentCaptor, 寫起來(lái)很麻煩, 用了自定義的matcher之后簡(jiǎn)化了很多.
ConstraintLayout Chains – Part 2
上一篇文章講過(guò)在ConstraintLayout中如何創(chuàng)建對(duì)稱的鏈?zhǔn)郊s束, 本篇文章介紹chainStyle的不同設(shè)置和比較.
默認(rèn)的spread chain: 均勻分布;
inside spread chain: 邊緣元素頂邊, 中間均勻分布.
如果指定了權(quán)重, 將會(huì)按照權(quán)重布局. 那么spread chain和inside spread chain就沒有區(qū)別了.
packed chain: 默認(rèn)會(huì)把所有元素都放在一起放在中間, 可以指定bias來(lái)定義偏移基準(zhǔn), 默認(rèn)bias是0.5, bias設(shè)置為0.25的意思就是往左偏.
A glimpse of Async-Await on Android
Kotlin 1.1推出了coroutines, 這是一個(gè)讓計(jì)算可以在某個(gè)點(diǎn)暫停然后之后又恢復(fù)的功能, 例子是幾年前C#的Async-Await.
作者先舉例說(shuō)明了異步操作的幾種常見實(shí)現(xiàn), 最后結(jié)合自己的庫(kù)用Async-Await做了一個(gè)例子.
What's different in 2.0
RxJava2.0.0已經(jīng)發(fā)布了. 這是它的wiki page來(lái)介紹2.0有什么不同.
Activity Revival and the case of the Rotating Device
本篇文章講configuration變化(比如屏幕旋轉(zhuǎn))導(dǎo)致的Activity重建.
為什么configuration變化的時(shí)候要重建Activity呢? 因?yàn)橄到y(tǒng)想要盡力地做一些helpful的事情, 希望在這種時(shí)候能重新加載正確的資源.
怎么處理呢?
方法一: 讓系統(tǒng)自動(dòng)處理. 在屏幕旋轉(zhuǎn)時(shí), onSaveInstanceState()
會(huì)在Activity銷毀前調(diào)用, 可以存儲(chǔ)一些狀態(tài), 之后重建的時(shí)候從bundle中拿出來(lái)恢復(fù).
方法二: 自己處理. 如果你想要獲取更多控制, 那么你可以在manifest中聲明configChanges
類型, 然后在Activity中覆寫onConfigurationChanged()
方法, 來(lái)自己做處理.
另外文章中還討論了網(wǎng)絡(luò)請(qǐng)求, 屏幕方向設(shè)置, retained fragment的使用等.
RxJava and Retrofit Throwing a Tantrum
作者討論了他們?cè)陧?xiàng)目中遇到的一個(gè)問題.
他們用RxJavaHooks.enableAssemblyTracking();
來(lái)收集RxJava崩潰棧信息, 可以顯示出到底是哪一個(gè)Observable崩了.
使用這個(gè)工具以后發(fā)現(xiàn)了一個(gè)問題, 進(jìn)而研究了JDK的Throwable
類.
原來(lái)cause不存在(this)和cause未知(null)是兩種不同的情況, 但是Throwable
的getCause()
方法都會(huì)返回null.
Retrofitting Espresso
用Espresso做測(cè)試, 如何等待網(wǎng)絡(luò)請(qǐng)求結(jié)束再驗(yàn)證UI.
Composing functions in Kotlin with extensions and operators
結(jié)合Kotlin的extensions和operator overloading功能, 改善function, 讓代碼變得更優(yōu)雅.
Authentication sucks. Bad security too
一個(gè)例子, 說(shuō)明為什么老的驗(yàn)證方法用戶體驗(yàn)不好, 我們?nèi)绾卧谌匀豢紤]用戶安全的情況下進(jìn)行改善.
解決方案是用Android 6.0推出的Android Keystore.
作者展示了如何實(shí)現(xiàn)并提供了Demo.
Design
Eight don’ts for your Material Design app
Material Design app需要避免的8個(gè)點(diǎn).
LIBRARIES & CODE
Android-proguards
使用一行就可以加上所有流行庫(kù)的proguard.
Moxy
一個(gè)MVP的庫(kù).
WiseFy
包裝了Android的WifiManager和ConnectivityManager的一個(gè)庫(kù).
VIDEOS & PODCASTS
Droidcon NYC 2016
所有Droidcon NYC 2016的視頻資源.