LoginSignup
2
0

More than 3 years have passed since last update.

lifecycle-livedata-ktx を使ってみた

Last updated at Posted at 2020-04-04

lifecycle-livedata-ktx とは名前のとおりLiveDataのKTX拡張機能のことである。
具体的には、LiveData + Coroutine で組み合わせて非同期で値を取得して返す仕組みである。

導入方法

app/build.gradleに以下を追加するだけ。

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}

公式にも載っている
https://developer.android.com/kotlin/ktx

使い方

ViewModelクラスで、このように書くことができる。

class MainViewModel : ViewModel() {

    // 変数宣言と共に、liveData関数内に非同期処理を実装できる
    val data: LiveData<String> = liveData {
        // 結果を出力
        emit("Hello")
    }

そしてFragmentから先ほどのdata変数を購読する。

// observeした時に処理が開始される
viewModel.data.observe(viewLifecycleOwner, Observer { data ->
    // Helloが表示される
    binding.message.text = data
})

observeした時にliveData関数が呼び出されるので、使用タイミングには気をつけること。

実用的に使うとこんな感じ

ViewModel側

class MainViewModel : ViewModel() {

    // lifeData変数にAPI取得を実装できる
    val ktxLiveData: LiveData<ScreenState> = liveData {
        emit(ScreenState.Loading)
        val data = doSomeThing()
        emit(ScreenState.Data(data))
    }

    // API通信やDB取得などの処理
    private suspend fun doSomeThing(): SomeData {
        delay(3000L)
        return SomeData(123)
    }

Fragment側でlivedataをobserveするとAPIなどの処理が実行される

class MainFragment : Fragment() {
    private fun loadKtxLiveData() {
        viewModel.ktxLiveData.observe(viewLifecycleOwner, Observer { state ->
            when (state) {
                is ScreenState.Loading -> {
                    Log.d("MainFragment", "Loading表示")
                }
                is ScreenState.Data -> {
                    Log.d("MainFragment", "取得成功 Data: ${state.someData}")
                    binding.message.text = state.someData.id.toString()
                    Log.d("MainFragment", "Finish")
                }
                is ScreenState.Error -> {
                    // Errorハンドリング
                    Log.d("MainFragment", "Errorダイアログ表示")
                }
            }
        })
    }

もしくは、DataBindingにちょくせつViewModelを渡してしまえば、もっとコードを省ける。

使用コード

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0