Globalscopeを避ける方法
通常、あなたが走る必要があるとき
suspend
あなたのAndroidアプリを開発中にviewModelScope
習慣から.何を考える必要はありませんCoroutineScope
すべてのロジックがビューモデルでほとんど発生します.(注意:これを確認してください.
よく、時々、表示モデルの外でasync仕事を走らせる必要があります.例えば、外部SDKがアプリケーション固有の操作を実行するためのクラスのインスタンスを必要とするのはかなり一般的です.
これらのケースでは、一般的なアンチパターンは
GlobalScope
coroutine scope . しかし、このAPIは悪用され、メモリリークを作成するのはかなり簡単です.例えば、あなたがネットワーク要求(アプリケーション特有のAsync操作のための全く一般的なケース)を作っているならば、それは生きていて、資源を浪費するままであるネットワーク問題です.これらのケースの理想的なアプローチは
CoroutineScope
. どんなメモリリークや不要なリソース割り当ても避ける必要がなくなったとき、あなたはasync仕事をキャンセルする責任があることを忘れないでください.class AppRelatedProvider @Inject constructor(
private val repository: Repository
) : SdkInterfaceForAppRelatedProvider {
private val scope = CoroutineScope(Dispatchers.IO) // 1.
override fun provideSomething(callback: Callback) {
try {
scope.launch { // 2.
val response = repository.fetchAppRelatedSomething()
callback.onSuccess(response)
}
} catch (e: RepositoryException) {
callback.onFailure(e)
}
}
protected fun finalize() {
scope.cancel() // 3.
}
}
CoroutineScope
. 非同期ワークが実行される「ディスパッチャ」(すなわちスレッド)を明示的に設定できます.バックグラウンド/ネットワークワークの場合Dispatchers.IO
デフォルトのメインスレッドの代わりに設定する必要があります.suspend
関数を手動で作成CoroutineScope
. finalize()
は、ガベージコレクターがオブジェクトを破棄する直前に呼び出されます.理想的には、あなたのasync仕事がもはや必要でないより多くの「特定の」点がなければなりません.CoroutineScope
sを避けるGlobalScope
可能なときはいつでも).Reference
この問題について(Globalscopeを避ける方法), 我々は、より多くの情報をここで見つけました https://dev.to/rockandnull/manual-coroutinescopes-how-to-avoid-globalscope-1obhテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol