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