Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

今日伝えたいこと 2

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

なにがどうなるの? 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Pagingライブラリあり ● FugaRepositoryでやること ○ Repository内でDataSource.Factoryを作る ■ PageKeyedDataSource / ItemKeyedDataSource / PositionalDataSource のいずれかをAPIや用途によって選択する ○ DataSource.Factory内で読み込みタイミングに応じたabstract methodを記述する ■ PageKeyedDataSourceとItemKeyedDataSourceなら下記3つ ● loadInitial : 初回読み込み、SwipeRefresh ● loadBefore : リストの一番上に戻ったときの追加読み込み ● loadAfter : リストの一番下に行った時の追加読み込み ■ PositionalDataSourceはInitialとRangeの読み込み概念のみ 11

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

PagingとKotlin 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Love Kotlin!!! 21