Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AAC Paging & Kotlin化の紹介

Koji Wakamiya
November 27, 2019

AAC Paging & Kotlin化の紹介

Koji Wakamiya

November 27, 2019
Tweet

More Decks by Koji Wakamiya

Other Decks in Technology

Transcript

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

    View Slide

  2. 今日伝えたいこと
    2

    View Slide

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

    View Slide

  4. 自己紹介
    ● Koji Wakamiya
    ○ Github https://github.com/koji-1009
    ○ Blog https://blog.dr1009.com/
    ● Studyplus株式会社
    ○ Androidアプリケーションエンジニア
    ○ iOSアプリ開発にも参加中
    ○ Flutterのもくもく会とかもときたま開催
    ● デスストとポケモンとリングフィットの並走中
    4

    View Slide

  5. MISSION
    「学ぶ喜びをすべての人へ」
    多くの人がStudyplusを通じて学習のきっかけを見つけ、
    学習を楽しく継続できることを実現する。
    5

    View Slide

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

    View Slide

  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

    View Slide

  8. なにがどうなるの?
    8

    View Slide

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

    View Slide

  10. Pagingライブラリあり
    class HogeViewModel(private val repository: FugaRepository) : ViewModel() {
    val items: LiveData> = repository.items().pagedList
    }
    10

    View Slide

  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

    View Slide

  12. Pagingライブラリでなにがよくなる?
    12
    1. ページネーションされたAPIにおける、現在のページ概念が
    Repository層にまとまる
    2. キャッシュの追加読み込み
    /破棄ロジックが簡潔に記述できる
    3. (Roomと組み合わせることで)タイムラインと詳細画面のような
    追加読み込みが反映しにくい構造をなんとかできる

    View Slide

  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通知

    View Slide

  14. Pagingの仕組み(概略)
    14
    https://codelabs.developers.google.com/codelabs/android-paging/#2

    View Slide

  15. PagingとKotlin
    15

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. Kotlinになると何がよくなるの?
    ● Kotlin Coroutinesがサポート!
    ○ これまではRetrofitのCallやExecutorを使って対応していた APIリクエスト処理が、 suspendになるかも!
    ● sealed classによるstate管理!
    ○ when文でsealed classによる分岐のチェックが適切に働くかも!
    20

    View Slide

  21. Love Kotlin!!!
    21

    View Slide