【Kotlin/Android Studio】LiveDataの使い方!更新を監視してUIとデータの同期

この記事からわかること

  • Android StudioLiveData利用する方法
  • 画面再構築される際にデータ保持するには?
  • ViewModel変更監視とは?
  • MutableLiveDataLiveData違い
  • LifecycleOwnerとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:LiveData

環境

ViewModelで実装できたこと

上記の記事でViewModelを実装し画面を横向きにしてもデータが損なわれないようにできました。

【Kotlin/Android Studio】ViewModelの使い方!画面再構築のデータ保持 【Kotlin/Android Studio】ViewModelの使い方!画面再構築のデータ保持 【Kotlin/Android Studio】ViewModelの使い方!画面再構築のデータ保持

しかし画面を一度横にした際にはUI上ではデータがリセットされてしまったかのように見えるのが欠点だったのでそこをLiveDataを利用して補っていきたいと思います。

LiveDataとは?

Androidアプリ開発のLiveDataJetPackのコンポーネントの1つとして提供されているデータを監視できる機能です。LiveDataではライフサイクルに応じた監視が可能になっており、ActivityやFragment、ViewModelなどの監視がより鮮明に可能になります。

メリット

Androidではアプリの画面が縦型から横向きに変更になる際に画面が再構築されるという特徴があります。この際にデータやUI状態などが一度リセットされてしまうため同じ画面を表示することができない場合があります。これをViewModelでデータのキャッシュまではできているのでLiveDataを利用してUIに反映させていきたいと思います。

実装方法

最新のAndroid Studio:Flamingoであればプロジェクト内で使用するために必要な導入作業は必要ありません。またプロジェクトの全体はGitHubに上げていますので参考にしてください。

今回はViewModelで作成した「ボタンクリックで2つのカウンターが変化する」アプリを改修していきます。

ViewModelのプロパティをMutableLiveDataに変更

LiveDataを使用するためにはViewModelのプロパティをMutableLiveDataクラスとLiveDataクラスの2つに変更します。Mutableとは「可変」という意味で変更可能な構造変更不可(immutable)な構造の2つを用意しています。これは外部からViewModelのデータを変更されないようにしているためです。


class MyViewModel:ViewModel() {
    private val my_counter: MutableLiveData<Int> = MutableLiveData<Int>(0)

    val count:LiveData<Int> = my_counter

    fun plus(){
        val counter = my_counter.value ?: throw Exception("Invalid _count value")
        my_counter.value = counter + 1
    }
}

これで監視するためのデータを定義することができました。

監視を開始

監視を開始するためには以下のように書き換えます。


button.setOnClickListener {

    planeCounter++
    vm.plus()
    planeText.setText(planeCounter.toString())
}
val countObserver = Observer<Int> {it
    vmText.text = it.toString()
}
vm.count.observe(this,countObserver)

まずObserverLiveDataの変更を監視し、変更があった場合に実行する関数を設定しています。

val countObserver = Observer<Int> {it
    vmText.text = it.toString()
}

そしてobserveメソッドで変更の監視を始めます。引数には監視の終了タイミングなどを依存するLifecycleOwnerを指定します。今回はActivityのためthisで良いですがFragmentで使用する際はメモリリークが発生する可能性があるためviewLifecycleOwnerを使用してください。

vm.count.observe(this,countObserver)

これでアプリを横向きにしてもViewModel側のみデータが損なわれることはなくなりました

【Kotlin/Android Studio】ViewModelの使い方!画面再構築のデータ保持

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index