November 27th, 2016
Android Weekly Issue #233
本期內容包括: 用Mockito作RxJava的單元測試; Android開發中的命令行使用; Android 7.1的App Shortcuts; 自定義View的繪製; 用Firebase的Remote Config進行feature逐步分發; APK分析工具的使用, APK瘦身討論; RxJava處理網絡請求和緩存; presenter的設計; 用Firebase發送push notification; transient關鍵字的使用等.html
這篇文章講了如何用Mockito給RxJava的異步請求代碼寫單元測試.
內容包括了:java
MockitoConfiguration
類).blockingGet()
; 2.在RxJava2中, 可使用TestObserver
的awaitTerminalEvent()
).flatMap()
, concatMap()
, concatMapEager()
操做符的使用.好用的工具: AssertJ
用來更方便地寫Java測試中的assert語句.android
做者分享了在Android開發中他是如何使用命令行的.ios
使用更好的命令行程序: iTerm2.
它有不少有用的features, 好比分屏, 自定義顏色, 粘貼歷史等.git
on-my-zsh:github
on-my-zsh內置了一個git plugin, 提供了不少aliases和功能.數據庫
zsh-autosuggestions會在你輸入的時候根據歷史提供建議.canvas
你能夠用Ctrl + R在命令歷史中進行逆向智能搜索(Reverse intelligent search). 你開始輸入這個命令, 命令行會在歷史中尋找並自動補全. 你能夠按Enter來執行這個命令, 或者左右箭頭來編輯命令, 或者繼續按Ctrl + R在其餘可能的命令中尋找.瀏覽器
dryrun緩存
若是你在github上看到一個程序, 想要運行一下看看, 你沒必要再把它下載下來, 導入Android Studio了.
你只須要用dryrun, 一句命令就能夠:
dryrun REMOTE_GIT_URL
Build faster, build offline
在build的時候使用--offline可讓全部依賴都使用緩存版本, 再也不進行網絡請求, 從而加快執行速度.
./gradlew assembleDevelopDebug --offline ./gradlew test --offline
在Android Studio中也能夠進行設置.
在Settings -> Build, Execution, Deployment -> Build tools -> Gradle
中勾選Offline work
便可.
alfi
alfi是一個工具, 裝了這個工具以後, 用一行命令就能夠查到第三方庫的依賴語句, 而後你就能夠把它拷貝粘貼到build.gradle
中去了.
gradle tasks shortcuts
gradle的task有縮寫版的, 好比:
Android Rocket Launcher
Android Rocket Launcher增長新的tasks, 在命令行啓動應用.
直接在console輸出單元測試結果:
android { ... testOptions.unitTests.all { testLogging { events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' outputs.upToDateWhen { false } showStandardStreams = true } } }
這個工具pidcat能夠指定包名顯示log.
這篇文章講Android 7.1推出的App Shortcuts如何實現.
做者分享了她在適配Nougat, API 25時學到的東西, 包括更換SDK版本, 圓形的啓動icon, 還有app shortcuts. (根據文中的圖標, 這個app竟然是domain).
做者自定義了一個ViewPager的page indicator: PageIndicatorView.
這篇文章講述瞭如何自定義View, 首先是View的生命週期, 而後是具體如何實現, 如何避免一些常見的錯誤, 最後是如何添加View的動畫.
各個生命週期中應該乾的事情:
onAttachedToWindow()
中: 能夠發現同一佈局中相關的其餘View, 其id是上一步經過自定義屬性傳入的.onMeasure()
: 自定義View尺寸相關, 當覆蓋這個方法時, 最後要調用setMeasuredDimension(int width, int height)
.onLayout()
: 通常這個方法是給ViewGroup的child指定位置和尺寸的, 對於自定義View來講, 沒有child就沒有必要覆蓋這個方法.onDraw()
: 這裏是畫東西的地方. 用canvas和Paint結合繪製. 須要注意的是onDraw()
會被屢次調用, 當你有一些變化, 滾動滑動等, 都會重繪, 因此這個方法中不要建立新對象.View更新
有兩個方法可讓View重繪:
invalidate()
: 只是從新繪製, 調用onDraw()
方法.requestLayout()
: 將會從onMeasure()
開始, 可能會改變尺寸, 而後根據新尺寸從新繪製.Animation
自定義View的動畫是一幀幀進行的, 這就意味着你每一步都要調用invalidate()
來畫它.
在自定義View中你的動畫好助手是ValueAnimator
, 它可讓你動畫任何值.
Staged Rollout是Google Play Store的一個feature. 讓你能夠慢慢地把新版App發佈給一部分用戶, 並逐漸增大比例. 使用Firebase Remote Config, 咱們能夠作的更多, 咱們能夠控制某個feature的發佈.
Android Studio中Build菜單有一項是Analyze APK...
, 這是一個頗有用的功能.
Raw File Size
是apk在磁盤上的大小.
Download size
是估計下載你的應用所須要的數據流量大小, 考慮到了Play Store的壓縮.
文件和文件夾是按照大小降序排列的. 這對於Apk瘦身來講頗有用, 很容易發現最佔地方的緣由.
好比做者發現了一些png很佔地方, 因而就用PSD support in the Vector Asset import tool把它們轉成了VectorDrawable
, 後向兼容用VectorDrawableCompat
.
有一些沒有壓縮的WAV能夠轉成OGG.
在lib/裏面, 發現它們要支持的三個ABI: x86, armeabi-v7a, armeabi, 解決的辦法就是利用apk拆分, 針對每個ABI有一個不一樣的版本.
還有一個優化是把android:extractNativeLibs
屬性設置爲false, 這樣系統就不會把.so文件在安裝的時候從apk中拷貝到文件系統了. 這樣應用的增量更新也會小一點.
這個功能有一個"Compare with"按鈕, 利用它你能夠比較兩個apk的改變.
能夠經過查看DEX文件來查看方法數限制 (Referenced Methods), 類混淆等問題.
Rxify
: The Anti Cache-then-Network OR Network-then-Cache Problem用RxJava處理網絡請求和緩存.
.concatWith()
和.take(1)
..onErrorReturn()
.做者認爲在Presenter中放入太多生命週期的方法不太好, 他以爲最基本的只須要這兩個方法:
public interface Presenter { void onViewAttached(MVPView view); void onViewDetached(); }
固然當你須要更多的時候能夠加入更多, 可是咱們不該該每一個生命週期方法都加進去.
使用Firebase Messaging如何發送push notification.
使用.fromCallable()
來把一個同步方法包裝成一個Observable.
並比較了和.just()
的區別. (.just()
發射的東西在建立的時候就肯定了, 而.fromCallable()
是在subscribe的時候肯定的.)
transient
修飾符加在字段上時, 在對象被序列化的時候, 這個字段將被排除在外, 反序列化時這個字段將被初始化一個默認值.
可能的使用場景:
transient
.注意transient和static是不能並存的, 由於static默認是transient的.
騰訊的熱補丁(hot-fix)解決方案, 支持不從新安裝app的dex, library和資源更新.
在瀏覽器裏看應用的數據庫和shared preferences.
實時模糊佈局. 像iOS同樣.