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される恐れもある