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 .
  • それがもはや必要でないとき、どんなasync仕事を止めるのを忘れないでください.この場合、 finalize() は、ガベージコレクターがオブジェクトを破棄する直前に呼び出されます.理想的には、あなたのasync仕事がもはや必要でないより多くの「特定の」点がなければなりません.
  • うまくいけば、それはどのように作成し、独自の管理方法は少し明確ですCoroutineScope sを避けるGlobalScope 可能なときはいつでも).