Help us understand the problem. What is going on with this article?

Androidで使っていこうKotlin コルーチン

More than 1 year has passed since last update.

ZOZOテクノロジーズ Advent Calendar 2018 の1日目の記事になります。

Kotlin コルーチンをAndroidで使っていこうぜ

Kotlin 1.3からstableとなったKotlin コルーチンをAndroidで使っていくためのTIPSを書いてみたいと思います。

以前のpotatotips #56で登壇した資料もよろしければご覧ください。

https://speakerdeck.com/yshogo/androidkai-fa-tipsgong-you-hui

Retrofitと一緒に使う

Retrofitと一緒に使う場合はこんな実装をします。

  • build.gradle
// kotlin coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1"

// retrofit
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2"

あとはRepositoryでこんな実装を書いて

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

コルーチンを使って呼び出します。

val service = InfoRepository().getInfo()
launch {
         val request = service.getInfo()
         val response = request.await()
         if (response.isSuccessful) {
            print(response.body())
         } else {
            // エラー
            print(response.errorBody())
         }
      }

GlobalScope.launchはあまりつかわなくていいと思う

GlobalScopeは使わなくてもいいと思います。GlobalScopeは 呼び出しときからアプリが終了するまで保持される ので生存期間が長すぎると思います。

ですので、 CoroutineScope をimplementsしましょう。

そして、ViewModelが破棄されたのと同時にjobをキャンセルすれば、生存期間がActivityを同じになります。

class HomeViewModel: ViewModel(), CoroutineScope {

    private val loadingJob: Job = Job()

    override val coroutineContext: CoroutineContext
        get() = loadingJob

    override fun onCleared() {
        super.onCleared()
        loadingJob.cancel()
    }

   fun getInfo() {
      val service = InfoRepository().getInfo()
      launch {
         val request = service.getInfo()
         val response = request.await()
         if (response.isSuccessful) {
            print(response.body())
         } else {
            // エラー
            print(response.errorBody())
         }
      }
   }
}

UIを触りにいくためには、 Dispatchers.Main をつける

Kotlin 1.3より前は UI をつけていましたが、1.3からは Dispatchers.Main に変わりました。

launch(Dispatchers.Main) {
    message.text = "10"
}

詳しくは下記の公式サイトに詳しく載っているのでご覧ください。

https://kotlinlang.org/docs/reference/coroutines-overview.html

これから

Kotlinコルーチンについてはまだ出てきてから、少ししか経ってないので手探りの状態だと思います。
どんどん触っていって、どんどん記事を書いていきましょう!!!!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away