Zli × CA 合同LT にて発表
Paging2から3に移行した話2020/08/22 Zli × CA 合同LT会
View Slide
自己紹介HN: マヤミト本名: 富山雄太会津大学26期 (学部3年)Zli 現代表GitHub: https://github.com/yt8492好きな技術: Android, Kotlin, gRPC趣味: Kotlin, 同人音声, VTuberTwitter: yt8492
Pagingってどんなの?ページング ライブラリを使用すると、データの小さなチャンクを一度に読み込んで表示することができます。 部分的なデータをオンデマンドで読み込むことで、ネットワーク帯域幅とシステム リソースの使用量を削減できます。(https://developer.android.com/topic/libraries/architecture/paging?hl=ja より引用)RecyclerViewのページング処理を簡単に実装できるライブラリ最新の安定版リリースは2.1.2だが、先日アルファ版で3.0.0がリリースされた
Paging3で変わったこと(一部)- Kotlin Coroutinesのサポート- PagingDataやState、ErrorをCoroutineのFlowで扱うように- データを取得するloadメソッドがsuspend関数に- APIの簡易化- 2ではデータ取得の処理の実装に DataSourceやDataSource.Factoryを実装する必要があったが、3ではPagingSourceの実装のみで済む- 2ではDataSourceのデータ取得の処理に初回ロード、次ページ読み込み、前ページ読み込みでメソッドが3つに分かれていたが、 3では1つのメソッドに統合
実際に移行してみよう
before: PageKeyedDataSource- ロードの種類でメソッドが分かれる- Coroutineを使いたい場合は自前でCoroutineScopeを用意する必要がある- 表示させたいリストのデータと次のkeyをコールバックに渡す- DataSource.Factoryも実装する必要がある
after: PagingSource- メソッドが1つに- suspend関数として実装- 返り値の型が成功と失敗の直和型- 初回ロードの場合はkeyがnull
before: ViewModel- PagedListはLiveDataで提供される- 更新処理はDataSource.invalidateを呼び出す
after: ViewModel- PagingDataをFlowで扱うかLiveDataで扱うか選ぶことができる- 更新処理はPagingDataAdapterで用意されているため自前で実装する必要がない- Flowを使う場合、cachedInで引数に渡したCoroutineScopeの間キャッシュされる
before: Fragment- 更新処理はViewModelに生やしたrefreshを呼ぶ- PagedListのLiveDataをobserveし、変更が走るたびにPagedListAdapterにsubmitListする- ローディングなどのアニメーションがある場合、refreshを呼ぶタイミングでアニメーションを発火し変更が走ったタイミングで止める
after: Fragment- 更新処理はPagingDataAdapterに生えているrefreshを呼ぶ- PagingDataをFlowで扱う場合はcollectLatestでsubmitDataする- PagingDataAdapter.dataRefreshFlowには更新が終わったタイミングでtrueが流れてくる- PagingDataAdapter.loadStateFlowにはロードの状態が流れてくるため、アニメーションを細かく設定するならこっちのほうが向いてるかも
使ってみた感想- Paging3はよりKotlinフレンドリーになっている- Paging2より簡潔かつ強力になっている- 単純に移行するだけならすぐ終わるので、一度試す価値はあると思う- 早く安定版リリースされてくれーーッ(出たばかりなので恐らく当分先)
今回のコードQiitaClienthttps://github.com/yt8492/QiitaClientPaging2を使ったコードは paging2 ブランチに、Paging3を使ったコードはmasterブランチにあります
参考資料ページング ライブラリの概要https://developer.android.com/topic/libraries/architecture/pagingPaging 3 library overviewhttps://developer.android.com/topic/libraries/architecture/paging/v3-overviewAndroid Paging codelabhttps://codelabs.developers.google.com/codelabs/android-paging