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.launchとCoroutineScope.launchを使い分ける- CoroutineScope.thisが届く範囲のlaunch/async等はそのまま動作する
- 「とりあえずlaunchって書けば非同期になるよ」みたいなことが言えなくなる
- Android Studioの場合、
Alt + Enterで移行先を示してくれるUIをDispatchers.Mainにしてくれたり、いろいろ- デフォルト引数が設定されている場合、勝手にデフォルト値が転記されてしまうので、全自動は無理
- CommonPoolは補完されないので手動で
Dispatchers.Defaultにする
withContext{}で渡されるthisのスコープが変わった- ブロック内でフィールド変数にアクセスしてる場合、スコープ範囲外でエラーになる
this@HogeFuga.fieldName = Hogeみたいに書き換える
悲観的推測
- GlobalScopeの場合とCoroutineScope.thisのLaunchでJobの親子関係が異なるかもしれない?
- ちゃんと移行しないと、
job.cancel()の挙動とかに影響あるかも
- ちゃんと移行しないと、
- 0.24 -> 0.25のときのように破壊的変更が次期バージョンでRevertされる恐れもある