April 16th, 2017
Android Weely Issue #253.
本期內(nèi)容包括: Android O新推出的自定義字體支持; 用Espresso測試自定義View; 在添加測試的過程中解耦在Activity中寫的程序; SQLite的性能研究; 用FileProvider分享Glide的緩存文件; 基于物理的動畫; Android O的隱式廣播限制; RxJava和DiffUtil的結(jié)合; 向Mockito 2.x的遷移; 用Transition scene framework實(shí)現(xiàn)的shared element transition.

ARTICLES & TUTORIALS

Android O: Fonts – Part 1

Android O中的自定義字體支持.

Google Fonts是一個很好的資源網(wǎng)站, 里面的字體都是開源的, 可以在app中免費(fèi)試用.

下載了字體資源(.ttf)之后, 加入項(xiàng)目資源字體文件夾:res/font/, 點(diǎn)擊會顯示字體的preview.

使用的時候只需要這樣:

android:fontFamily="@font/pacifico"

Testing Views in Isolation with Espresso on Android

作者他們的項(xiàng)目用了很多自定義的View, 把邏輯包含進(jìn)去. (其實(shí)我個人不是很贊成這種做法).

本文介紹用Espresso來測試這種自定義View.

Test Driving away Coupling in Activities

目標(biāo)代碼是一個Activity中有動態(tài)權(quán)限請求模塊, 本文首先企圖給它加上測試, 在加測試的過程中對原來的代碼進(jìn)行重構(gòu)(抽取了View接口), 然后說明了這樣做的好處: 解耦, 易于修改; 減少了重復(fù)代碼.

Squeezing Performance from SQLite

本文介紹當(dāng)你需要在SQLite數(shù)據(jù)庫中插入大量數(shù)據(jù)的時候, 各種做法以及它們的性能比較.

實(shí)驗(yàn)1: 比較db.insert包不包transaction.

結(jié)果: 把一系列insert()操作包在transaction里可以大幅度地改善性能.

為什么呢? 根據(jù)文檔:
如果你不顯示地指定transaction, 那么SQLite自己會在每一個操作上加一個隱式的transaction.

要知道SQLite只在transaction被提交的時候把插入數(shù)據(jù)寫入磁盤, 所以, 如果你能減少transaction的數(shù)量, 你就可以減少磁盤訪問, 從而提高效率.

實(shí)驗(yàn)2: 比較db.execSQLdb.insert.

結(jié)果: 使用db.execSQL可以輕微地改善性能.

原因: db.insert()包裝抽象了SQL語句的創(chuàng)建, 這一層還是需要一點(diǎn)花銷的.

實(shí)驗(yàn)3: 用db.execSQL()批處理插入.

結(jié)果: 可以提升一部分性能.

但是注意每個語句中有最大的變量數(shù)限制: 999. 所以如果你的表有越多列, 那么批處理所獲得的性能提升就越少.

實(shí)驗(yàn)4: 直接使用SQLiteStatement.

SQLiteStatementinsert()execSQL()更底層.

作者在這里做了兩個實(shí)驗(yàn): 一個是復(fù)用單條記錄插入的SQLiteStatement語句對象; 另一個是復(fù)用批處理的SQLiteStatement語句對象.

結(jié)果: 跟用db.execSQL()批處理相比: 復(fù)用單條記錄插入的語句對象并沒有獲得性能改善; 但是復(fù)用批處理的插入語句可以提供一點(diǎn)兒性能的提高.

Share the Cache

很多app都有看圖片的功能, 其中很多用了圖片緩存庫, 比如Glide來處理圖片的緩存. 分享這些緩存的圖片就有點(diǎn)tricky了, 要考慮到這些問題:

  • 我如何訪問cache中的文件?

  • 其他應(yīng)用也有權(quán)限訪問這些文件嗎?

  • 如果我需要手動拷貝文件到其他地方去, 我需要什么權(quán)限?

有一種做法是: 首先把圖片再緩存到其他公有的位置, 生成一個URI, 然后把這個URI用intent發(fā)送出去分享給其他應(yīng)用. 這個聽起來很簡單, 但是實(shí)際上有點(diǎn)復(fù)雜, 因?yàn)樽x寫外部存儲都需要用戶允許權(quán)限(Android 6.0以上).

所以本文要介紹的是用FileProvider的方法.

首先在Manifest中注冊FileProvider.
然后在Glide中修改了緩存文件的路徑.
(值得注意的是用Glide緩存的文件都是沒有后綴名的, 所以作者在他的項(xiàng)目中強(qiáng)加了后綴名.) 最后再通過Intent分享出去:

String authority = “com.yourdomain.android.fileprovider”;
Uri uri = FileProvider.getUriForFile(context, authority, file);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/jpeg");
context.startActivity(Intent.createChooser(intent, “Share via”);

Physics-based Animation

Google的官方文檔, 介紹如何使用新的基于物理的動畫系統(tǒng). (physics-based animation).

基于物理原理的動畫看起來更自然, 更真實(shí).

文檔中舉了一個例子, 中途改變動畫的目標(biāo)值, 比較了基于Animator的動畫和基于物理的動畫有什么區(qū)別: 前者需要取消當(dāng)前動畫設(shè)定新的目標(biāo)值, 速度發(fā)生了突變; 后者只是改變了受力, 速度是連續(xù)的, 看起來更自然.

有關(guān)彈簧動畫, 詳情請見: Spring Animation.

Android O and the Implicit Broadcast Ban

Android O和隱性廣播限制.

首先解釋了這種限制是什么; 為什么需要加上這條限制(RAM, Battery); 都有哪些廣播受到影響; 以及對這一系統(tǒng)改動可以采取的一些應(yīng)對政策(動態(tài)廣播, 顯式廣播, 先不要升級, 改用其他的通信方式等).

A nice combination of RxJava and DiffUtil

使用DiffUtil, 你只需要提供新舊數(shù)據(jù)的比較.

但是如果你的數(shù)據(jù)集很大, 或者你要做的比較很復(fù)雜, 你應(yīng)該避免在主線程調(diào)用DiffUtil的計算. 你可以把比較工作放在后臺線程, 然后在主線程通知UI.

因?yàn)槟阈枰容^新舊數(shù)據(jù), 所以你需要在后臺線程訪問當(dāng)前數(shù)據(jù), 這就意味著這個數(shù)據(jù)會在多個線程被訪問, 可能你就需要同步或者線程安全的數(shù)據(jù)結(jié)構(gòu), 如何避免這些呢? -> 使用RxJava.

里面涉及到了對.scan()操作符的使用, 核心代碼如下:

disposable = ThingRepository
    .latestThings(2, TimeUnit.SECONDS)
    .scan(initialPair, (pair, next) -> {
      MyDiffCallback callback = new MyDiffCallback(pair.first, next);
      DiffUtil.DiffResult result = DiffUtil.calculateDiff(callback);      return Pair.create(next, result);
    })
    .skip(1)
    .subscribeOn(computation())
    .observeOn(mainThread())
    .subscribe(listDiffResultPair -> {
      adapter.setThings(listDiffResultPair.first);
      listDiffResultPair.second.dispatchUpdatesTo(adapter);
    });

完整代碼見: RxJavaAndDiffUtil.

Mockito 2.x over PowerMock Migration Tips and Tricks

Mockito 2.x發(fā)布了, 包括了可以mock final的的功能和對Java 8的支持等.

如果你之前在用Mockito 1.x寫測試, 現(xiàn)在如何遷移呢? 如果你之前的測試中還用了PowerMock, 那么遷移起來將會更加困難.

本篇文章提到了你在把Mockito從1.x遷移到2.x的過程中可能會遇到的問題及解決方案.

Shared Element Transition with RecyclerView and Scenes - Part 4

使用transition scene framework實(shí)現(xiàn)的shared element transition動畫效果.

LIBRARIES & CODE

MaterialChipsInput

Material Design中Chips組件的Android實(shí)現(xiàn). 提供了兩種Views: ChipsInputChipView.

AdaptiveTableLayout

一個讓你可以閱讀, 編輯CSV文件的庫.

NEWS

Java 8 Language Features Support Update

Android Studio從2.4開始就要支持Java 8了! 預(yù)覽版已經(jīng)發(fā)布.

分類: Android Weekly

標(biāo)簽: AndroidAndroid WeeklyAndroid OfontEspressoSQLiteFileProviderGlidePhysics-based AnimationSpringAnimationAnimation

April 16th, 2017
Android Weely Issue #253.
本期內(nèi)容包括: Android O新推出的自定義字體支持; 用Espresso測試自定義View; 在添加測試的過程中解耦在Activity中寫的程序; SQLite的性能研究; 用FileProvider分享Glide的緩存文件; 基于物理的動畫; Android O的隱式廣播限制; RxJava和DiffUtil的結(jié)合; 向Mockito 2.x的遷移; 用Transition scene framework實(shí)現(xiàn)的shared element transition.

ARTICLES & TUTORIALS

Android O: Fonts – Part 1

Android O中的自定義字體支持.

Google Fonts是一個很好的資源網(wǎng)站, 里面的字體都是開源的, 可以在app中免費(fèi)試用.

下載了字體資源(.ttf)之后, 加入項(xiàng)目資源字體文件夾:res/font/, 點(diǎn)擊會顯示字體的preview.

使用的時候只需要這樣:

android:fontFamily="@font/pacifico"

Testing Views in Isolation with Espresso on Android

作者他們的項(xiàng)目用了很多自定義的View, 把邏輯包含進(jìn)去. (其實(shí)我個人不是很贊成這種做法).

本文介紹用Espresso來測試這種自定義View.

Test Driving away Coupling in Activities

目標(biāo)代碼是一個Activity中有動態(tài)權(quán)限請求模塊, 本文首先企圖給它加上測試, 在加測試的過程中對原來的代碼進(jìn)行重構(gòu)(抽取了View接口), 然后說明了這樣做的好處: 解耦, 易于修改; 減少了重復(fù)代碼.

Squeezing Performance from SQLite

本文介紹當(dāng)你需要在SQLite數(shù)據(jù)庫中插入大量數(shù)據(jù)的時候, 各種做法以及它們的性能比較.

實(shí)驗(yàn)1: 比較db.insert包不包transaction.

結(jié)果: 把一系列insert()操作包在transaction里可以大幅度地改善性能.

為什么呢? 根據(jù)文檔:
如果你不顯示地指定transaction, 那么SQLite自己會在每一個操作上加一個隱式的transaction.

要知道SQLite只在transaction被提交的時候把插入數(shù)據(jù)寫入磁盤, 所以, 如果你能減少transaction的數(shù)量, 你就可以減少磁盤訪問, 從而提高效率.

實(shí)驗(yàn)2: 比較db.execSQLdb.insert.

結(jié)果: 使用db.execSQL可以輕微地改善性能.

原因: db.insert()包裝抽象了SQL語句的創(chuàng)建, 這一層還是需要一點(diǎn)花銷的.

實(shí)驗(yàn)3: 用db.execSQL()批處理插入.

結(jié)果: 可以提升一部分性能.

但是注意每個語句中有最大的變量數(shù)限制: 999. 所以如果你的表有越多列, 那么批處理所獲得的性能提升就越少.

實(shí)驗(yàn)4: 直接使用SQLiteStatement.

SQLiteStatementinsert()execSQL()更底層.

作者在這里做了兩個實(shí)驗(yàn): 一個是復(fù)用單條記錄插入的SQLiteStatement語句對象; 另一個是復(fù)用批處理的SQLiteStatement語句對象.

結(jié)果: 跟用db.execSQL()批處理相比: 復(fù)用單條記錄插入的語句對象并沒有獲得性能改善; 但是復(fù)用批處理的插入語句可以提供一點(diǎn)兒性能的提高.

Share the Cache

很多app都有看圖片的功能, 其中很多用了圖片緩存庫, 比如Glide來處理圖片的緩存. 分享這些緩存的圖片就有點(diǎn)tricky了, 要考慮到這些問題:

  • 我如何訪問cache中的文件?

  • 其他應(yīng)用也有權(quán)限訪問這些文件嗎?

  • 如果我需要手動拷貝文件到其他地方去, 我需要什么權(quán)限?

有一種做法是: 首先把圖片再緩存到其他公有的位置, 生成一個URI, 然后把這個URI用intent發(fā)送出去分享給其他應(yīng)用. 這個聽起來很簡單, 但是實(shí)際上有點(diǎn)復(fù)雜, 因?yàn)樽x寫外部存儲都需要用戶允許權(quán)限(Android 6.0以上).

所以本文要介紹的是用FileProvider的方法.

首先在Manifest中注冊FileProvider.
然后在Glide中修改了緩存文件的路徑.
(值得注意的是用Glide緩存的文件都是沒有后綴名的, 所以作者在他的項(xiàng)目中強(qiáng)加了后綴名.) 最后再通過Intent分享出去:

String authority = “com.yourdomain.android.fileprovider”;
Uri uri = FileProvider.getUriForFile(context, authority, file);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/jpeg");
context.startActivity(Intent.createChooser(intent, “Share via”);

Physics-based Animation

Google的官方文檔, 介紹如何使用新的基于物理的動畫系統(tǒng). (physics-based animation).

基于物理原理的動畫看起來更自然, 更真實(shí).

文檔中舉了一個例子, 中途改變動畫的目標(biāo)值, 比較了基于Animator的動畫和基于物理的動畫有什么區(qū)別: 前者需要取消當(dāng)前動畫設(shè)定新的目標(biāo)值, 速度發(fā)生了突變; 后者只是改變了受力, 速度是連續(xù)的, 看起來更自然.

有關(guān)彈簧動畫, 詳情請見: Spring Animation.

Android O and the Implicit Broadcast Ban

Android O和隱性廣播限制.

首先解釋了這種限制是什么; 為什么需要加上這條限制(RAM, Battery); 都有哪些廣播受到影響; 以及對這一系統(tǒng)改動可以采取的一些應(yīng)對政策(動態(tài)廣播, 顯式廣播, 先不要升級, 改用其他的通信方式等).

A nice combination of RxJava and DiffUtil

使用DiffUtil, 你只需要提供新舊數(shù)據(jù)的比較.

但是如果你的數(shù)據(jù)集很大, 或者你要做的比較很復(fù)雜, 你應(yīng)該避免在主線程調(diào)用DiffUtil的計算. 你可以把比較工作放在后臺線程, 然后在主線程通知UI.

因?yàn)槟阈枰容^新舊數(shù)據(jù), 所以你需要在后臺線程訪問當(dāng)前數(shù)據(jù), 這就意味著這個數(shù)據(jù)會在多個線程被訪問, 可能你就需要同步或者線程安全的數(shù)據(jù)結(jié)構(gòu), 如何避免這些呢? -> 使用RxJava.

里面涉及到了對.scan()操作符的使用, 核心代碼如下:

disposable = ThingRepository
    .latestThings(2, TimeUnit.SECONDS)
    .scan(initialPair, (pair, next) -> {
      MyDiffCallback callback = new MyDiffCallback(pair.first, next);
      DiffUtil.DiffResult result = DiffUtil.calculateDiff(callback);      return Pair.create(next, result);
    })
    .skip(1)
    .subscribeOn(computation())
    .observeOn(mainThread())
    .subscribe(listDiffResultPair -> {
      adapter.setThings(listDiffResultPair.first);
      listDiffResultPair.second.dispatchUpdatesTo(adapter);
    });

完整代碼見: RxJavaAndDiffUtil.

Mockito 2.x over PowerMock Migration Tips and Tricks

Mockito 2.x發(fā)布了, 包括了可以mock final的的功能和對Java 8的支持等.

如果你之前在用Mockito 1.x寫測試, 現(xiàn)在如何遷移呢? 如果你之前的測試中還用了PowerMock, 那么遷移起來將會更加困難.

本篇文章提到了你在把Mockito從1.x遷移到2.x的過程中可能會遇到的問題及解決方案.

Shared Element Transition with RecyclerView and Scenes - Part 4

使用transition scene framework實(shí)現(xiàn)的shared element transition動畫效果.

LIBRARIES & CODE

MaterialChipsInput

Material Design中Chips組件的Android實(shí)現(xiàn). 提供了兩種Views: ChipsInputChipView.

AdaptiveTableLayout

一個讓你可以閱讀, 編輯CSV文件的庫.

NEWS

Java 8 Language Features Support Update

Android Studio從2.4開始就要支持Java 8了! 預(yù)覽版已經(jīng)發(fā)布.

分類: Android Weekly

標(biāo)簽: AndroidAndroid WeeklyAndroid OfontEspressoSQLiteFileProviderGlidePhysics-based AnimationSpringAnimationAnimation

http://www.cnblogs.com/mengdd/p/android-weekly-notes-issue-253.html