31
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ZOZOテクノロジーズAdvent Calendar 2018

Day 1

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

Last updated at Posted at 2018-11-30

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

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

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

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

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"
}

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

これから

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

31
26
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
31
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?