PrecomputedTextを試してみる
Android Pの新機能を紹介するAndroid Developers Blogを読んでいて、PrecomputedTextに興味を惹かれたので掘り下げてみました。
なぜPrecomputedTextが生まれたのかというと
- テキストのレイアウト決定には様々な処理が必要で時間がかかる
- レイアウト決定処理はUIスレッドで行われる
- レイアウト決定処理の90%を別スレッドで処理できるようにしてUIスレッドの負荷を下げる
ということのようです。
PrecomputedTextはAndroid Pで提供されるAPIで、それ以前のバージョンに対してはJetpackの一部としてPrecomputedTextCompatが提供されます。PrecomputedTextCompatはAPI14以降をサポートしますが、バージョンによって挙動が異なります。
- API 28以降:PrecomputedTextによるフルサポート
- API 21から27: PrecomputedTextCompatによるサポート
relies on internal text layout cache.
なので部分的なサポート?
- API 14から20: PrecomputedTextCompatがサポートしているが、内部的には何もしない
恩恵を受けられるのはAndroid5系から、ということですね。4系でも効果がないだけで問題なく動きますし、OSの普及率を踏まえると導入検討に値すると思います。
minSdkVersionを28にしたサンプルプロジェクトを作って検証してみました。
PrecomputedText | Android Developersにあるサンプルをベースにユーティリティクラス化してみます。
public class Utils {
private static Executor executor = Executors.newFixedThreadPool(1);
public static void setTextAsync(TextView textView, final String string) {
final PrecomputedText.Params params = textView.getTextMetricsParams();
final WeakReference<TextView> textViewRef = new WeakReference<>(textView);
executor.execute(new Runnable() {
@Override
public void run() {
TextView textView = textViewRef.get();
if (textView != null) {
final PrecomputedText precomputedText = PrecomputedText.create(string, params);
textView.post(new Runnable() {
@Override
public void run() {
TextView textView = textViewRef.get();
if (textView != null) {
textView.setText(precomputedText);
}
}
});
}
}
});
}
}
UIスレッドと別スレッドの2つを扱わないといけないので、ベタなJavaで書くとイマイチです。kotlinなりラムダ式なりで書いたらもうちょっとすっきりしそう。
PrecomputedTextCompat(というかJetpack)はAndroid Studio3.2からじゃないと使えないので、実戦投入はAndroid Studio3.2の正式リリース待ちですかね。複雑なテキストを扱うアプリは恩恵を受けられそうですから、先に検証しておくのはアリだと思います。
【2018/7/23 追記 ここから】
RecyclerViewを題材に掘り下げて調べている記事を見つけたのでリンクを貼っておきます。
【2018/7/23 追記 ここまで】
関連(するかもしれない)記事
おススメ