CoroutineWorker でのスレッド化

Kotlin ユーザーは WorkManager を使用することによってコルーチンを最大限に活用できます。そのためにはまず、gradle ファイルに work-runtime-ktx を追加します。次に、Worker とは API が若干異なる CoroutineWorker を拡張します。たとえば、シンプルな CoroutineWorker を作成してなんらかのネットワーク操作を行う場合は、次のようにします。

    class CoroutineDownloadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

        override suspend fun doWork(): Result = coroutineScope {
            val jobs = (0 until 100).map {
                async {
                    downloadSynchronously("https://www.google.com")
                }
            }

            // awaitAll will throw an exception if a download fails, which CoroutineWorker will treat as a failure
            jobs.awaitAll()
            Result.success()
        }
    }
    

CoroutineWorker.doWork() は suspend 関数であることに注意してください。このコードは Worker とは異なり、Configuration で指定された Executor では実行されません。代わりに、デフォルトで Dispatchers.Default が指定されます。これをカスタマイズするには、独自の CoroutineContext を用意します。上の例ではおそらく、次のように Dispatchers.IO で処理を実行する必要があります。

    class CoroutineDownloadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

        override val coroutineContext = Dispatchers.IO

        override suspend fun doWork(): Result = coroutineScope {
            val jobs = (0 until 100).map {
                async {
                    downloadSynchronously("https://www.google.com")
                }
            }

            // awaitAll will throw an exception if a download fails, which CoroutineWorker will treat as a failure
            jobs.awaitAll()
            Result.success()
        }
    }
    

CoroutineWorker は、コルーチンをキャンセルしてキャンセル信号を伝達することにより、停止を自動的に処理します。処理の停止に対処するための特別な操作は必要ありません。