AAC Paging & Kotlin化の紹介

494a2760dceccc31c4bcdb689041c614?s=47 Koji Wakamiya
November 27, 2019

AAC Paging & Kotlin化の紹介

494a2760dceccc31c4bcdb689041c614?s=128

Koji Wakamiya

November 27, 2019
Tweet

Transcript

  1. AAC Paging & Kotlin化の紹介 2019.11.27 Kotlin愛好会 vol.17 @JapanTaxi

  2. 今日伝えたいこと 2

  3. Paging処理を これ以上書きたくないという 強い気持ち 3

  4. 自己紹介 • Koji Wakamiya ◦ Github https://github.com/koji-1009 ◦ Blog https://blog.dr1009.com/

    • Studyplus株式会社 ◦ Androidアプリケーションエンジニア ◦ iOSアプリ開発にも参加中 ◦ Flutterのもくもく会とかもときたま開催 • デスストとポケモンとリングフィットの並走中 4
  5. MISSION 「学ぶ喜びをすべての人へ」 多くの人がStudyplusを通じて学習のきっかけを見つけ、 学習を楽しく継続できることを実現する。 5

  6. Pagingライブラリとは 1. 大量のデータ(SQLiteで保存されているもの)を メモリに優しく読み込む 2. ページネーションされたAPIの取得を いい感じに対応してくれる 3. RecyclerViewの差分更新を いい感じになんとかしてくれる

    6
  7. Pagingライブラリとは • Android Architecture Components 勉強会 #6 ◦ https://gdg-tokyo.connpass.com/event/127484/ ◦

    http://yaraki.github.io/slides/aac-paging/index.html • Codelab ◦ https://codelabs.developers.google.com/codelabs/android-paging/ • PagingSample(Google architecture-components-samples) ◦ https://github.com/android/architecture-components-samples/tree/master/PagingSample • PagingWithNetworkSample(Google architecture-components-samples) ◦ https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample 7
  8. なにがどうなるの? 8

  9. Pagingライブラリなし class HogeViewModel(private val repository: FugaRepository) : ViewModel() { val

    items: LiveData<List<Item>> = cacheLiveData private val chachLiveData: MutableLiveData<List<Item>> = MutableLiveData(emptyList()) private val cacheList: List<Item> = mutableList() private var currentPage = 0 fun fetchNext() { ~~~ } } 9
  10. Pagingライブラリあり class HogeViewModel(private val repository: FugaRepository) : ViewModel() { val

    items: LiveData<PagedList<Item>> = repository.items().pagedList } 10
  11. Pagingライブラリあり • FugaRepositoryでやること ◦ Repository内でDataSource.Factoryを作る ▪ PageKeyedDataSource / ItemKeyedDataSource /

    PositionalDataSource のいずれかをAPIや用途によって選択する ◦ DataSource.Factory内で読み込みタイミングに応じたabstract methodを記述する ▪ PageKeyedDataSourceとItemKeyedDataSourceなら下記3つ • loadInitial : 初回読み込み、SwipeRefresh • loadBefore : リストの一番上に戻ったときの追加読み込み • loadAfter : リストの一番下に行った時の追加読み込み ▪ PositionalDataSourceはInitialとRangeの読み込み概念のみ 11
  12. Pagingライブラリでなにがよくなる? 12 1. ページネーションされたAPIにおける、現在のページ概念が Repository層にまとまる 2. キャッシュの追加読み込み /破棄ロジックが簡潔に記述できる 3. (Roomと組み合わせることで)タイムラインと詳細画面のような

    追加読み込みが反映しにくい構造をなんとかできる
  13. Pagingの仕組み(概略) 13 1. AbstractListをPagedListをPagedListAdapterが受け取る a. PagedListAdapterを継承したAdapterをRecyclerViewにセットする b. PagedListAdapterのgetItemはnullable (なおListAdapterはnon-null) 2.

    PagedListAdapterがPagedListにスクロール状態を伝える a. PagedListAdapterがPagedListのgetメソッドを呼び出す 3. PagedListのgetメソッドが要素かnullを返す a. データを保持している、読み込み終わっているなら要素を返す b. データを破棄している、まだ読み込んでいないなら読み込みを開始する i. 読み込み終わったら、 RecyclerViewのDataAdapterObserverにinsert通知
  14. Pagingの仕組み(概略) 14 https://codelabs.developers.google.com/codelabs/android-paging/#2

  15. PagingとKotlin 15

  16. 16 https://twitter.com/stsn_jp/status/1193453333433831430

  17. 17 https://youtu.be/hSBnczpWBkA?t=540

  18. 18 https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/paging/runtime/src/main/java/androidx/paging

  19. 19 https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/paging/runtime/src/main/java/androidx/paging

  20. Kotlinになると何がよくなるの? • Kotlin Coroutinesがサポート! ◦ これまではRetrofitのCallやExecutorを使って対応していた APIリクエスト処理が、 suspendになるかも! • sealed

    classによるstate管理! ◦ when文でsealed classによる分岐のチェックが適切に働くかも! 20
  21. Love Kotlin!!! 21