Android
Kotlin

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())
            }
        }
}

これで完成です。

参考