LiveData + Coroutine + RetrofitでAPI呼び出しを簡潔に実装する


はじめに

LivedataがCoroutineに対応したので、

これらを利用してretrofitを用いたAPIの呼び出しを書きました。


使用ライブラリ


app.gradle

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha02"

implementation "com.squareup.retrofit2:retrofit:2.6.0"


実装

GitHubのAPIを用いてユーザー情報を取得するサンプルです。

ModelやDIの実装については割愛させていただきます。


API定義


GithubApi.kt

interface GithubApi {

@GET("/users/{user}")
fun getUser(@Path("user") loginName: String): LiveData<GithubUser>
}

Retrofitを用いたAPI呼び出しの定義部分。返り値の型をLiveDataにしています。


API呼び出し


GithubRepository.kt

class GithubRepository(val githubApi: GithubApi) {

fun getUser(loginName: String) = liveData {
emitSource(githubApi.getUser(loginName))
}
}

上で定義したAPIの呼び出しです。

liveDataブロック内で受け取るliveDataを処理します。

emitSource()するとliveDataに値が流れ込みます。


LiveDataの取得


GithubViewModel.kt

class GithubViewModel(application: Application, private val repository: GithubRepository) : AndroidViewModel(application) {

fun getUser(loginName: String) = repository.getUser(loginName)
}

あとはViewModelやFragmentなどでLiveDataとして値を取得できるので、

observeしたりdatabindingに値をセットしたりして利用します。

以上、Coroutine対応したLiveDataを用いてAPI呼び出しを実装する例を書きました。


参考

Lifecycle | Android Developers