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.execSQL
和db.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
.
SQLiteStatement
比insert()
和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: ChipsInput
和ChipView
.
AdaptiveTableLayout
一個讓你可以閱讀, 編輯CSV文件的庫.
NEWS
Java 8 Language Features Support Update
Android Studio從2.4開始就要支持Java 8了! 預(yù)覽版已經(jīng)發(fā)布.
分類: Android Weekly
標(biāo)簽: Android, Android Weekly, Android O, font, Espresso, SQLite, FileProvider, Glide, Physics-based Animation, SpringAnimation, Animation
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.execSQL
和db.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
.
SQLiteStatement
比insert()
和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: ChipsInput
和ChipView
.
AdaptiveTableLayout
一個讓你可以閱讀, 編輯CSV文件的庫.
NEWS
Java 8 Language Features Support Update
Android Studio從2.4開始就要支持Java 8了! 預(yù)覽版已經(jīng)發(fā)布.
分類: Android Weekly
標(biāo)簽: Android, Android Weekly, Android O, font, Espresso, SQLite, FileProvider, Glide, Physics-based Animation, SpringAnimation, Animation
http://www.cnblogs.com/mengdd/p/android-weekly-notes-issue-253.html