$30 off During Our Annual Pro Sale. View Details »

Paging2から3に移行した話

 Paging2から3に移行した話

Zli × CA 合同LT にて発表

Yuta Tomiyama

August 22, 2020
Tweet

More Decks by Yuta Tomiyama

Other Decks in Programming

Transcript

  1. Paging2から3に移行した話
    2020/08/22 Zli × CA 合同LT会

    View Slide

  2. 自己紹介
    HN: マヤミト
    本名: 富山雄太
    会津大学26期 (学部3年)
    Zli 現代表
    GitHub: https://github.com/yt8492
    好きな技術: Android, Kotlin, gRPC
    趣味: Kotlin, 同人音声, VTuber
    Twitter: yt8492

    View Slide

  3. Pagingってどんなの?
    ページング ライブラリを使用すると、データの小さなチャンクを一度に読み込んで表示す
    ることができます。 部分的なデータをオンデマンドで読み込むことで、ネットワーク帯域
    幅とシステム リソースの使用量を削減できます。
    (https://developer.android.com/topic/libraries/architecture/paging?hl=ja より引用)
    RecyclerViewのページング処理を簡単に実装できるライブラリ
    最新の安定版リリースは2.1.2だが、先日アルファ版で3.0.0がリリースされた

    View Slide

  4. Paging3で変わったこと(一部)
    - Kotlin Coroutinesのサポート
    - PagingDataやState、ErrorをCoroutineのFlowで扱うように
    - データを取得するloadメソッドがsuspend関数に
    - APIの簡易化
    - 2ではデータ取得の処理の実装に DataSourceやDataSource.Factoryを実装する必要があったが、
    3ではPagingSourceの実装のみで済む
    - 2ではDataSourceのデータ取得の処理に初回ロード、次ページ読み込み、前ページ読み込みでメ
    ソッドが3つに分かれていたが、 3では1つのメソッドに統合

    View Slide

  5. 実際に移行してみよう

    View Slide

  6. before: PageKeyedDataSource
    - ロードの種類でメソッドが分かれる
    - Coroutineを使いたい場合は自前で
    CoroutineScopeを用意する必要がある
    - 表示させたいリストのデータと次のkey
    をコールバックに渡す
    - DataSource.Factoryも実装する必要が
    ある

    View Slide

  7. after: PagingSource
    - メソッドが1つに
    - suspend関数として実装
    - 返り値の型が成功と失敗の
    直和型
    - 初回ロードの場合はkeyがnull

    View Slide

  8. before: ViewModel
    - PagedListはLiveDataで提供される
    - 更新処理はDataSource.invalidate
    を呼び出す

    View Slide

  9. after: ViewModel
    - PagingDataをFlowで扱うかLiveDataで扱うか選ぶことができる
    - 更新処理はPagingDataAdapterで用意されているため自前で実装する必要がない
    - Flowを使う場合、cachedInで引数に渡したCoroutineScopeの間キャッシュされる

    View Slide

  10. before: Fragment
    - 更新処理はViewModelに生やしたrefreshを呼ぶ
    - PagedListのLiveDataをobserveし、変更が走るたびにPagedListAdapterにsubmitList
    する
    - ローディングなどのアニメーションがある場合、refreshを呼ぶタイミングでアニメーション
    を発火し変更が走ったタイミングで止める

    View Slide

  11. after: Fragment
    - 更新処理はPagingDataAdapterに
    生えているrefreshを呼ぶ
    - PagingDataをFlowで扱う場合は
    collectLatestでsubmitDataする
    - PagingDataAdapter.dataRefreshFlow
    には更新が終わったタイミングで
    trueが流れてくる
    - PagingDataAdapter.loadStateFlowに
    はロードの状態が流れてくるため、
    アニメーションを細かく設定するな
    らこっちのほうが向いてるかも

    View Slide

  12. 使ってみた感想
    - Paging3はよりKotlinフレンドリーになっている
    - Paging2より簡潔かつ強力になっている
    - 単純に移行するだけならすぐ終わるので、一度試す価値はあると思う
    - 早く安定版リリースされてくれーーッ(出たばかりなので恐らく当分先)

    View Slide

  13. 今回のコード
    QiitaClient
    https://github.com/yt8492/QiitaClient
    Paging2を使ったコードは paging2 ブランチに、Paging3を使ったコードはmasterブラン
    チにあります

    View Slide

  14. 参考資料
    ページング ライブラリの概要
    https://developer.android.com/topic/libraries/architecture/paging
    Paging 3 library overview
    https://developer.android.com/topic/libraries/architecture/paging/v3-overview
    Android Paging codelab
    https://codelabs.developers.google.com/codelabs/android-paging

    View Slide