guntamania

なんとかキャッチアップ

[2020-09-12 Sat]

なんとかキャッチアップしたのを公開。

MvvmCoroutines

koin, LiveData, Coroutines を触ってみた結果。 内容自体はBitcoinレポジトリのIssueを見るViewer。 特に面白い内容ではないけど、特にCoroutinesは触れてよかった。

とはいえ、色々イマイチな部分が残っている..

今回は3パターンの方法で実装している。

1つ目は Coroutine を Flow でラップし、 collect で非同期処理をコールしているもの( MainViewModel 参照 )。 なんとなくラップする感覚が RxJava に似ている部分がなくもなく、直感的に実装しやすかった。

2つ目は Scope#launch を使って呼び出しているもの( Sub01ViewModel 参照)。 Defferedlaunch 内でコールするという、多分 Coroutines の中では一番ポピュラーな方法だと思う。

3つ目は LiveData Coroutine Builder を用いて liveData{ } で直接LiveDataのインスタンスを生成する方法( Sub02ViewModel 参照)。 LiveDataを直接作れるってことは、すぐにViewにBindできることを期待したんだけど、なぜか明示的に Observe しないと動いてくれない.. 要するに意図せずColdな状態になっているんだと思うんだけど、Githubを探してみたけど、いい参考コードも見つからなかった。 ここはあまりにイマイチなのでそのうち調査して修正したい。

で、画面下部にスクロールしたら自動的に読み込む、いわゆる「無限スクロール」 を実装したかったんだが、ここも実装がイマイチになってしまった。 色々調べていると、最近は PagedList を使うらしい..

ページング ライブラリの概要 | Android developers

先にこっちを見とけば。。。

LiveDataはHotなのかColdなのか。

LiveDataのHot, Coldって意識できている? | Mori Atsushi

なるほどなあ。 どちらの挙動も示すのか。。どおりで..

前書いたViewModel内でも

private var issues = Transformations.switchMap(fresh) { page ->
    liveData<List<Issue>> {
        runCatching {
            repository.getIssues1(page)
        }.onSuccess {
            emit(it)
            callback?.invoke()
        }.onFailure { }
    }
}

としているのに、別の箇所で

issues.observeForever { }

とやってしまっていた。これは明らかにライフサイクルを無視しているので、よくない..

そしてまたもやソースをいじくったが、うまく行く方法が思いつかず..