Edited at

Kotlin Coroutines + Retrofit2を使ってAPIを叩く

Kotlin 1.3 からStableになるといわれているKotlin Coroutinesを勉強したのでメモとして書いておきます。

Kotlin Coroutinesって何??って方は下の記事を読めばだいたい理解できるかと思います。自分もこの記事を読んで学びました。


準備

まずはセットアップからしていきます。

前提として

- Retrofitは導入してある

- コンバータはMoshiを使うので導入してある

app/build.gradle に書きを追加します。


kotlin {
experimental {
coroutines "enable"
}
}

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.22.5"
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-experimental-adapter:1.0.0'

バージョンは最新のものを使用してください


実装


API通信


  • InfoService.kt


interface InfoService {

companion object {
const val baseUrl = "APIの接続先"
}

@GET("info/")
fun getInfo(): Deferred<Response<List<Info>>>
}

これでAPIの接続先とかを定義したので次はRetrofitインスタンスを作成します。


Retrofitインスタンス


  • InfoRepository.kt

class InfoRepository {

fun getInfo() = Retrofit.Builder().baseUrl(InfoService.baseUrl)
.addConverterFactory(MoshiConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build().create(InfoService::class.java)

}


Retrofitインスタンスを呼ぶ

次に定義したRetofitインスタンスをViewModelから呼びます。


  • InfoViewModel

fun start() {

val service = InfoRepository().getInfo()
launch {
val request = service.getInfo()
val response = request.await()
if (response.isSuccessful) {
// 成功
print(response.body())
val list = response.body() ?: return@launch
// ここで取得したデータでViewwをごにょごにょする
items.clear()
items.addAll(list)
} else {
// エラー
print(response.errorBody())
}
}
}

これで完成です。


参考