ViewModelとLiveData
ViewModelを使って構成変更に対応します。LiveDataでリアクティブなデータストリームを公開し、ActivityやFragmentで監視する方法を学びます。
「ViewModelとLiveData」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。
Activityの問題点
Activityに直接データを保存すると、主に2つの問題が発生します。
- ユーザーがスマートフォンを回転すると、Activityは破棄されて再作成されるため、データがすべて失われます
onCreateでネットワークからデータを取得すると、回転するたびに再取得され、無駄が生じます
ViewModelはこの2つの問題を解決します。
ViewModelとは
ViewModelは、次の役割を持つAndroid Architecture Componentです。
- 構成変更(回転やテーマ変更)をまたいで存続する
- UIに関連するデータとビジネスロジックを保持する
- ユーザーが画面を完全に離れたときにのみ破棄される
基本的な指針として、回転後も保持したいデータはViewModelに入れます。
ViewModelの作成
ViewModelを継承し、Gradleの依存関係に追加します。
// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
fun reset() {
count = 0
}
}ActivityでのViewModelの取得
ViewModelProvider(またはby viewModels()デリゲート)を使って、ViewModelインスタンスを取得します。
import androidx.activity.viewModels
class CounterActivity : AppCompatActivity() {
private lateinit var binding: ActivityCounterBinding
// Android manages the ViewModel lifecycle — never instantiate it yourself
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCounterBinding.inflate(layoutInflater)
setContentView(binding.root)
// This shows the count is preserved after rotation!
binding.tvCount.text = viewModel.count.toString()
binding.btnPlus.setOnClickListener {
viewModel.increment()
binding.tvCount.text = viewModel.count.toString()
}
}
}LiveDataとは
LiveDataは、監視可能なデータホルダーです。UIがLiveDataの値を監視し、値が変わるとUIが自動的に更新されます。
- ライフサイクルを認識する — アクティブなオブザーバーにのみ更新を通知します(Activityがバックグラウンドにある場合もクラッシュしません)
- 常に最新 — 新しいオブザーバーは、最新の値をすぐに受け取ります
ViewModelでのLiveData
MutableLiveDataは非公開で使用し(ViewModelから書き込み可能)、LiveDataとして公開します(UIは監視のみ可能です)。
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
private val _count = MutableLiveData(0)
val count: LiveData<Int> = _count // read-only for the UI
fun increment() {
_count.value = (_count.value ?: 0) + 1
}
fun reset() {
_count.value = 0
}
}ActivityでのLiveDataの監視
.observe(lifecycleOwner) { value -> }を呼び出して、変更に反応します。
class CounterActivity : AppCompatActivity() {
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// Automatically updates TextView whenever count changes
viewModel.count.observe(this) { count ->
binding.tvCount.text = count.toString()
}
binding.btnPlus.setOnClickListener { viewModel.increment() }
binding.btnReset.setOnClickListener { viewModel.reset() }
}
}LiveDataとState Flowの比較
LiveDataは従来からある方法です。現在のKotlinコードでは、代わりにKotlin CoroutinesのStateFlowを使うことがよくあります。
StateFlow— コルーチンベースで、Androidへの依存がありません- Activity内で
repeatOnLifecycleを使って収集します - 複雑な状態管理に適しています
どちらもよく機能します。LiveDataは使い始めるのが簡単で、より大規模なアプリではStateFlowを使うことが多くなります。
複数のオブザーバーを持つViewModel
複数のUIコンポーネントで同じLiveDataを監視できます。たとえば、TextViewとButtonの有効状態の両方が、ViewModel内の同じデータ値に反応できます。ViewModelに追加のコードは必要ありません。
これにより関心が明確に分離されます。ViewModelは状態を保持し、UIは監視して描画するだけです。
理解度チェック
ViewModelはいつ破棄されますか?
まとめ:ViewModelとLiveData
これで、ライフサイクルを考慮したUIを構築できるようになりました。
- ViewModelは構成変更(回転)をまたいで存続する
by viewModels()を使ってActivityでViewModelを取得する- MutableLiveData(非公開)とLiveData(公開)のパターンを使う
.observe(this) { value -> updateUI(value) }で監視する- UIは自動的に更新されるため、手動で更新する必要がない
次は、Roomデータベースを使ってデータを永続的に保存します。
よくある質問
「ViewModelとLiveData」レッスンは無料ですか?
はい。「ViewModelとLiveData」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。
「ViewModelとLiveData」で何を学びますか?
ViewModelを使って構成変更に対応します。LiveDataでリアクティブなデータストリームを公開し、ActivityやFragmentで監視する方法を学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/6です。
「ViewModelとLiveData」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。