eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

kotlin-coroutines 0.26.1での破壊的更新

coroutines 0.26.1の変更点

  • 多くのクラスやトップレベルfunctionやプロパティがdeprecatedになった

変更から見える方針

  • トップレベルの関数やプロパティを、いずれかのobject等に所属させることが主な目的に見える

主なDeprecated

  • UI, CommonPool 等の標準Dispatcherが非推奨
    • Dispatchers.Main, Dispatchers.Default が追加された
  • launch{}, async{} 等のトップレベル関数が非推奨
    • GlobalScope.launch, GlobalScope.async が追加された
  • isActive が拡張関数になった
    • ビルドが通らないので、ガイドに従って書き換える

互換性

  • Deprecated属性になっただけで、0.24のときのような内部の破壊的仕様変更はされていない
  • 様子見しつつ、移行して行こう。

移行時の注意

  • GlobalScope.launchCoroutineScope.launch を使い分ける
    • CoroutineScope.thisが届く範囲のlaunch/async等はそのまま動作する
    • 「とりあえずlaunchって書けば非同期になるよ」みたいなことが言えなくなる
  • Android Studioの場合、 Alt + Enter で移行先を示してくれる
    • UIDispatchers.Main にしてくれたり、いろいろ
    • デフォルト引数が設定されている場合、勝手にデフォルト値が転記されてしまうので、全自動は無理
    • CommonPoolは補完されないので手動で Dispatchers.Default にする
  • withContext{} で渡されるthisのスコープが変わった
    • ブロック内でフィールド変数にアクセスしてる場合、スコープ範囲外でエラーになる
    • this@HogeFuga.fieldName = Hoge みたいに書き換える

悲観的推測

  • GlobalScopeの場合とCoroutineScope.thisのLaunchでJobの親子関係が異なるかもしれない?
    • ちゃんと移行しないと、 job.cancel() の挙動とかに影響あるかも
  • 0.24 -> 0.25のときのように破壊的変更が次期バージョンでRevertされる恐れもある