Android Weekly Notes Issue #233

来源:http://www.cnblogs.com/mengdd/archive/2016/12/01/6123123.html
-Advertisement-
Play Games

本期內容包括: 用Mockito做RxJava的單元測試; Android開發中的命令行使用; Android 7.1的App Shortcuts; 自定義View的繪製; 用Firebase的Remote Config進行feature逐步分發; APK分析工具的使用, APK瘦身討論; RxJa... ...


Android Weekly Issue #233

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關鍵字的使用等.

ARTICLES & TUTORIALS

Testing asynchronous RxJava code using Mockito

這篇文章講瞭如何用Mockito給RxJava的非同步請求代碼寫單元測試.
內容包括了:

  • 如何設置Mockito的預設返回值. (通過自定義的MockitoConfiguration類).
  • 如何把非同步變為同步測試. (1.用blockingGet(); 2.在RxJava2中, 可以使用TestObserverawaitTerminalEvent()).
  • AssertJ的使用.
  • 測試非同步代碼. 使用Rule來替換原來的scheduler.
  • flatMap(), concatMap(), concatMapEager()操作符的使用.
  • 測試Timeout.
  • 測試異常和retry邏輯.

好用的工具: AssertJ
用來更方便地寫Java測試中的assert語句.

Mastering the Terminal side of Android development

作者分享了在Android開發中他是如何使用命令行的.

使用更好的命令行程式: iTerm2.
它有很多有用的features, 比如分屏, 自定義顏色, 粘貼歷史等.

on-my-zsh:

on-my-zsh內置了一個git plugin, 提供了很多aliases和功能.

zsh-autosuggestions會在你輸入的時候根據歷史提供建議.

你可以用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有縮寫版的, 比如:

  • iDD for installDevelopmentDebug
  • aDD for assembleDevelopmentDebug
  • cC for connectedCheck

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.

Exploring Android Nougat 7.1 App Shortcuts

這篇文章講Android 7.1推出的App Shortcuts如何實現.

The Quirks of Supporting SDK 25

作者分享了她在適配Nougat, API 25時學到的東西, 包括更換SDK版本, 圓形的啟動icon, 還有app shortcuts. (根據文中的圖標, 這個app居然是domain).

Android: draw a custom view

作者自定義了一個ViewPager的page indicator: PageIndicatorView.

這篇文章講述瞭如何自定義View, 首先是View的生命周期, 然後是具體如何實現, 如何避免一些常見的錯誤, 最後是如何添加View的動畫.
view lifecycle

各個生命周期中應該乾的事情:

  • 構造函數中: 解析自定義屬性.
  • 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, 它可以讓你動畫任何值.

How to Stage Rollout Features using Firebase Remote Config

Staged Rollout是Google Play Store的一個feature. 讓你可以慢慢地把新版App發佈給一部分用戶, 並逐漸增大比例. 使用Firebase Remote Config, 我們可以做的更多, 我們可以控制某個feature的發佈.

Making the most of the APK analyzer

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處理網路請求和緩存.

  • 如果先使用Cache, 沒有緩存的時候再進行網路請求. -> 用.concatWith().take(1).
  • 如果優先取網路最新數據, 沒網的時候才用緩存數據. -> .onErrorReturn().

Your presenters don’t need all those lifecycle events

作者認為在Presenter中放入太多生命周期的方法不太好, 他覺得最基本的只需要這兩個方法:

public interface Presenter {
  void onViewAttached(MVPView view); 
  void onViewDetached();
}

當然當你需要更多的時候可以加入更多, 但是我們不應該每個生命周期方法都加進去.

How to send notifications using Android Firebase

使用Firebase Messaging如何發送push notification.

RxRecipes: Wrap your way to Rx

使用.fromCallable()來把一個同步方法包裝成一個Observable.

並比較了和.just()的區別. (.just()發射的東西在創建的時候就確定了, 而.fromCallable()是在subscribe的時候確定的.)

Diving deeper into the Java transient modifier

transient修飾符加在欄位上時, 在對象被序列化的時候, 這個欄位將被排除在外, 反序列化時這個欄位將被初始化一個預設值.

可能的使用場景:

  • 實現了Serializable的User對象中的password欄位.
  • 一個Serializable的類中的某個欄位是通過其他欄位推導或派生出來的, 這些派生的欄位沒有必要被序列化, 於是把它們標記為transient.

註意transient和static是不能並存的, 因為static預設是transient的.

LIBRARIES & CODE

Tinker

騰訊的熱補丁(hot-fix)解決方案, 支持不重新安裝app的dex, library和資源更新.

Android-Debug-Database

在瀏覽器里看應用的資料庫和shared preferences.

blurkit-android

實時模糊佈局. 像iOS一樣.



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /*socket.io是一個基於 node.js 的項目,其主要作用是將WebScoket 協議應用到所有的瀏覽器。該模塊主要應用於實時的長連接 多請求的項目中,例如線上聯網游戲中、實時聊天、實施股票查看、二維碼掃描登錄等。 安裝配置和 npm 一樣: npm intall scoket.io 安裝 ...
  • 正常情況下直接寫這段代碼不寫!important,如果項目不能生效,需要加!important。 ...
  • 這是一段用jquery實現全選的代碼,主要思路如下: 1.所有的覆選框都有單擊事件,所有效果都是在單擊事件下實現的 2.全選覆選框所實現的功能與其他覆選選項實現的功能不同,所有在單擊事件內做一個判斷,是否是全選覆選框的單擊事件 3.如果是,則執行判斷全選覆選框是否選中,如果當前狀態為選中,那麼點擊後 ...
  • 之前關於如何實現屏幕頁面切換,寫過一篇博文《Android中使用ViewFlipper實現屏幕切換》,相比ViewFlipper,ViewPager更適用複雜的視圖切換,而且Viewpager有自己的adapter,這也讓其適應複雜對象,實現數據的動態載入。 ViewPager是谷歌官方給我們提供的 ...
  • 一、切UIView的某個角為圓角 如果需要將UIView的4個角全部都為圓角,做法相當簡單,只需設置其Layer的cornerRadius屬性即可(項目需要使用QuartzCore框架)。而若要指定某幾個角(小於4)為圓角而別的不變時,怎麼做呢? 其實很簡單,使用UIBezierPath,設置CAS ...
  • 創建一個自定義的開關,可以自行決定開關的背景。當滑動開關時,開關的滑塊可跟隨手指移動。當手指鬆開後,滑塊根據開關的狀態,滑到最右邊或者滑到最左邊,同時保存開關的狀態,將開關的狀態回調給調用者。 ...
  • ViewPager是一個可以用來滑動內部View的組件,他有一個老搭檔PagerAdapter,我們這次就來看看他們這兩位拍檔的本事。 我們要使用ViewPager與PagerAdapter結合 首先佈局文件 <android.support.v4.view.ViewPager android:id ...
  • 資源文件的引入可以有兩種方式,寫法如下: 1、s.resource = "DDKit/**/*.{png,bundle,xib,nib}" 2、s.resource_bundles = { 'DDKit' => ['DDKit/**/*.{png,bundle,xib,nib}'] 'DDKit' ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...