Android Weekly Issue #232. 本期内容包括: Kotlin的優勢讨論; MVVM模式結合RxJava和Retrofit的應用構架實作; Android中傳感器使用; 如何給App寫單元測試; Reductor的組合使用; Android應用程序被殺死的狀态恢複和問題處理; Kotlin中的Anko; 背景任務處理庫"Android Job"; VectorDrawable和PNG的使用問題等.
本期開源庫: 給ImageView和RelativeLayout的底部加曲線; 長按彈框; Switch Button控件; 給View加深度/厚度的庫.
November 20th, 2016
Android Weekly Issue #232
本期内容包括: Kotlin的優勢讨論; MVVM模式結合RxJava和Retrofit的應用構架實作; Android中傳感器使用; 如何給App寫單元測試; Reductor的組合使用; Android應用程序被殺死的狀态恢複和問題處理; Kotlin中的Anko; 背景任務處理庫"Android Job"; VectorDrawable和PNG的使用問題等.
作者他們team想要完全用kotlin開發一個應用.
本文是他們的心得體會.
關于函數式程式設計的學習, 作者推薦: 一個Scala的課程.
Kotlin的優勢: 和Java可以互相調用; 函數式語言; function purity; 高階函數(函數可以作為參數或傳回值); 不可變性(val); Null-safety; Anko; Kotlin Android extensions(移除了ButterKnife); 還有對初學者很友好, 可以擺脫很多第三方的依賴, 函數擴充等等優勢.
作者一年多以前寫過一個這個文章: RxJava: Android MVVM App structure with Retrofit, 介紹MVVM結合Retrofit和RxJava的App架構模式. 此篇文章是一年後作者對此的改進.
主要内容有:
1.通過View和ViewModel之間的協定接口, 讓ViewModel知道View的生命周期變化.
2.RxJava2的流式類型: Completable, Maybe, Flowable的使用.
3.用RxJava操作符組合網絡請求: 讓不同的網絡請求一起發送, 并且都傳回以後才得到通知 -> 用<code>.zip()</code>. 順序連接配接不同的網絡請求 -> <code>.flatMap()</code>, <code>.andThen()</code>.
4.背景網絡請求和View更新的處理: 不取消網絡請求, 等View再次resume的時候檢查狀态再更新. 這裡提供了兩種選擇, 一種是用前面提到的協定接口中的生命周期方法, 另一種是用<code>AsyncProcessor</code>.
5.Mock Retrofit的網絡請求.
這篇文章鼓勵你分享你的知識, 經驗, 問題及解決方法, 無論是通過演講還是寫出來的方式.
介紹了Android中傳感器的使用.
如何給你的App寫簡單的單元測試.
這是系列文章中的一篇, 繼續講Reductor library – Redux的Android版實作.
這篇文章結合例子将如何組合使用以及用@CombinedState來生成代碼.
本文探讨程序被殺死有可能導緻的種種問題.
你的Android應用如果在paused或者stopped狀态, 那麼它任何時候都有可能會被系統殺死. 這時候你的Activity, Fragment和View狀态将被儲存, 當你回到應用的時候, 系統會重新啟動程序, 重新建立Activity, 存儲的狀态會在bundle中傳回.
這個過程存在一個問題: 整個程序都被殺死了, 所有單例(或application scope的對象), 臨時資料, 還有retained Fragment中的資料, 這些所有都會處于一種全新建立的狀态, 但唯有一個不同, 一些在bundle中存儲的狀态被恢複出來了.
這樣有可能會導緻一些異常, 比如你的界面想要恢複一種狀态, 但是資料已經被清空了.
如何測試這種情況呢?
使用App, home鍵把它放進背景, 殺死app, 再恢複.
打開選項"Don't Keep Activities". 這種測試并不會殺死程序, 隻會測試Activity的狀态恢複.
設定Developer options中的Background Process Limit為"No background processes". 這樣把應用放在背景, 打開另一個應用, 再回來自己的應用, 将會重新開機程序.
相關問題信号
單例
儲存可變資料的共享的執行個體
Application類中儲存的資料和狀态
可變的靜态字段
Retained fragments(狀态恢複了, 但是資料卻丢失了)
基本上任何沒有在<code>onSaveInstanceState()</code>中儲存但是你卻依賴的狀态
這些問題沒有唯一的解決方案, 取決于你的應用.
作者把自己的一個布局改為用Kotlin的Anko, 然後測試性能.
好處是:
1.性能提升了, 避免了XML的運作時解析所花費的時間.
2.可以動态地加入邏輯, 比如版本判斷, 螢幕尺寸, 方向判斷等.
作者用的測試性能的工具是: AndroidDevMetrics
在Android上的背景工作, 你可以選擇<code>Alarm Manager</code>, <code>Job Scheduler</code>或<code>GCM Network Manager</code>.
為了幫開發者從每種實作中抽象出來, Evernote開源了一個庫: Android Job. 本文介紹了這個庫如何使用.
作者他們的應用中有VectorDrawable的版本相容問題, 用support library中的Compat版本也不好使, 于是他們在舊版本決定使用自動生成的png.
然後發現了生成png的顔色設定問題, 在舊版本生成的圖檔用的是fillColor而不是tintColor. 把fillColor設定成想要的顔色即可.
一個應用, 展示了Depth-LIB-Android-的功能.
在<code>ImageView</code>和<code>RelativeLayout</code>底部加上曲線的庫.
長按出現彈框的庫.
一個Switch Button的庫, 帶有更多自定義擴充功能.
這個庫給View加上深度/厚度.
作者: 聖騎士Wind
出處: 部落格園: 聖騎士Wind
Github: https://github.com/mengdd
微信公衆号: 聖騎士Wind
