1
/
5

【Kotlin】【Coroutines】asyncの挙動を確認する【株式会社ライトコード】

※弊社のエンジニア記事になります。

Android Coroutines Async の挙動を確認したのでメモとして残しておく

  1. 準備環境情報
    suspend関数作成
    例外発生用のsuspend関数作成
    ログ表示用のLiveData用意しておく
  2. まずは基本asyncを使わず普通にsuspendを呼び出す
    asyncを使ってみる
  3. asyncとsuspend関数を組み合わせたときの実行順番2つのawaitの間で別のsuspendを実行
    2つのasyncの間で別のsuspendを実行
  4. 特殊な実装をした場合2つのasyncを実行し、片方のawaitを呼ばない
    1つ目のasyncをlaunch前に実行して、launch内部でawaitする
  5. 例外を絡めた挙動

1.準備

// Coroutines
dependencies {
    <省略>
    def coroutines_android_version = '1.6.0'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_android_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_android_version"
    <省略>
}

suspend関数作成

まずはasyncで動作させるsuspend関数を作成

suspend fun mySuspend(name: String, delayTimeMillis: Long): Int {
    return withContext(Dispatchers.Default) {
        log.emit("---------start mySuspend() $name---------")
        var result = 0
        (1..5).forEach {
            result += (1..100).random()
            delay(delayTimeMillis)
            log.emit("mySuspend() $name - $it")
        }
        log.emit("---------finish mySuspend() $name---------")
        return@withContext result
    }

例外発生用のsuspend関数作成

例外を発生させる関数も作っておく

@Suppress("UNREACHABLE_CODE")
suspend fun error(name: String, crashTime: Int = 5): Int {
    withContext(Dispatchers.Default) {
        log.emit("---------start error() $name---------")
        (crashTime downTo 0).forEach {
            if (it <= 0) {
                log.emit("throw Exception!")
                throw Exception("error")
            }
            log.emit("throw Exception まで あと${it}秒")
            delay(1000L)
        }
        log.emit("---------finish error() $name---------")
    }
    return (1..100).random()
}

ログ表示用のLiveData用意しておく

TextViewにログを表示するために実装(必須ではない)

val log = MutableSharedFlow<String>(replay = 100)

val logTextLiveData: LiveData<String> = log.mapLatest {
    Log.d("my_log", it)
    val stringBuilder = StringBuilder()
    log.replayCache.forEach {
        stringBuilder.append(it)
        stringBuilder.append("\n")
    }
    stringBuilder.toString()
}.asLiveData()

記事の続きは以下URLからご覧ください。

https://rightcode.co.jp/blog/information-technology/kotlin-coroutines-async

【2024年卒】新卒採用エントリー開始しました!

特設ページはこちら:https://rightcode.co.jp/recruit/entry-2024

インターン募集!未経験ok、チャレンジ精神ある方求む

ゲームプランナー:https://rightcode.co.jp/recruit/intern-game-planner

メディア運営:https://rightcode.co.jp/recruit/intern-media

社長と一杯飲みながらお話しませんか?(転職者向け)

特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk

もっとワクワクする仕事をしたいあなたへ

現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!

有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。

  • もっと大きなことに挑戦したい!
  • エンジニアとしてもっと成長したい!
  • モダンな技術に触れたい!

現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?

ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。

  • ライトコードの魅力を知っていただきたい!
  • 社風や文化なども知っていただきたい!
  • 技術に対して熱意のある方に入社していただきたい!

一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。

【コーポレートサイト】https://rightcode.co.jp/

【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)

【wantedlyぺージ】https://www.wantedly.com/companies/rightcode

株式会社ライトコードでは一緒に働く仲間を募集しています
同じタグの記事
今週のランキング
株式会社ライトコードからお誘い
この話題に共感したら、メンバーと話してみませんか?