CoroutineWorker의 스레딩
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
WorkManager는 Kotlin 사용자에게 코루틴을 위한 최고 수준의 지원을 제공합니다. 시작하려면 gradle 파일에 work-runtime-ktx
를 포함해야 합니다. Worker
를 확장하는 대신 doWork()
의 정지 버전인 CoroutineWorker
를 확장해야 합니다. 예를 들어 간단한 CoroutineWorker
를 빌드하여 일부 네트워크 작업을 실행하려면 다음과 같이 하면 됩니다.
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
CoroutineWorker.doWork()
는 정지 함수입니다. Worker
와 달리 이 코드는 Configuration
에 지정된 Executor
에서 실행되지 않습니다. 대신 Dispatchers.Default
가 기본값으로 지정됩니다. 고유의 CoroutineContext
를 제공하여 이를 맞춤설정할 수 있습니다. 위의 예에서는 다음과 같이 Dispatchers.IO
에서 중지 작업을 실행할 수 있습니다.
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
withContext(Dispatchers.IO) {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
}
CoroutineWorker
는 코루틴을 취소하고 취소 신호를 전파하여 자동으로 중지를 처리합니다. 작업 중지를 처리하기 위해 특별히 해야 할 일은 없습니다.
다른 프로세스에서 CoroutineWorker 실행
ListenableWorker
의 구현인 RemoteCoroutineWorker
를 사용하여 작업자를 특정 프로세스에 바인딩할 수도 있습니다.
RemoteCoroutineWorker
는 작업 요청을 작성할 때 입력 데이터의 일부로 제공하는 두 개의 추가 인수 ARGUMENT_CLASS_NAME
과 ARGUMENT_PACKAGE_NAME
을 사용하여 특정 프로세스에 바인딩합니다.
다음 예에서는 특정 프로세스에 바인딩된 작업 요청을 빌드하는 방법을 보여줍니다.
Kotlin
val PACKAGE_NAME = "com.example.background.multiprocess"
val serviceName = RemoteWorkerService::class.java.name
val componentName = ComponentName(PACKAGE_NAME, serviceName)
val data: Data = Data.Builder()
.putString(ARGUMENT_PACKAGE_NAME, componentName.packageName)
.putString(ARGUMENT_CLASS_NAME, componentName.className)
.build()
return OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java)
.setInputData(data)
.build()
자바
String PACKAGE_NAME = "com.example.background.multiprocess";
String serviceName = RemoteWorkerService.class.getName();
ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName);
Data data = new Data.Builder()
.putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName())
.putString(ARGUMENT_CLASS_NAME, componentName.getClassName())
.build();
return new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class)
.setInputData(data)
.build();
RemoteWorkerService
마다 AndroidManifest.xml
파일에 서비스 정의도 추가해야 합니다.
<manifest ... >
<service
android:name="androidx.work.multiprocess.RemoteWorkerService"
android:exported="false"
android:process=":worker1" />
<service
android:name=".RemoteWorkerService2"
android:exported="false"
android:process=":worker2" />
...
</manifest>
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Threading in CoroutineWorker\n\nFor Kotlin users, WorkManager provides first-class support for [coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html). To get\nstarted, include [`work-runtime-ktx` in your gradle file](/jetpack/androidx/releases/work#declaring_dependencies). Instead of extending [`Worker`](/reference/androidx/work/Worker), you should extend [`CoroutineWorker`](/reference/kotlin/androidx/work/CoroutineWorker), which has a suspending\nversion of `doWork()`. For example, if you wanted to build a simple `CoroutineWorker`\nto perform some network operations, you would do the following: \n\n class CoroutineDownloadWorker(\n context: Context,\n params: WorkerParameters\n ) : CoroutineWorker(context, params) {\n\n override suspend fun doWork(): Result {\n val data = downloadSynchronously(\"https://www.google.com\")\n saveData(data)\n return Result.success()\n }\n }\n\nNote that [`CoroutineWorker.doWork()`](/reference/kotlin/androidx/work/CoroutineWorker#doWork()) is a *suspending*\nfunction. Unlike `Worker`, this code does *not* run on the `Executor` specified\nin your [`Configuration`](/reference/androidx/work/Configuration). Instead, it\ndefaults to `Dispatchers.Default`. You can customize this by providing your own `CoroutineContext`. In the above example, you would probably want to do this work on `Dispatchers.IO`, as follows: \n\n class CoroutineDownloadWorker(\n context: Context,\n params: WorkerParameters\n ) : CoroutineWorker(context, params) {\n\n override suspend fun doWork(): Result {\n withContext(Dispatchers.IO) {\n val data = downloadSynchronously(\"https://www.google.com\")\n saveData(data)\n return Result.success()\n }\n }\n }\n\n`CoroutineWorker` handles stoppages automatically by cancelling the coroutine\nand propagating the cancellation signals. You don't need to do anything special\nto handle [work stoppages](/topic/libraries/architecture/workmanager/how-to/managing-work#cancelling).\n\nRunning a CoroutineWorker in a different process\n------------------------------------------------\n\nYou can also bind a worker to a specific process by using\n[`RemoteCoroutineWorker`](/reference/kotlin/androidx/work/multiprocess/RemoteCoroutineWorker),\nan implementation of `ListenableWorker`.\n\n`RemoteCoroutineWorker` binds to a specific process with two extra arguments\nthat you provide as part of the input data when building the work request:\n`ARGUMENT_CLASS_NAME` and `ARGUMENT_PACKAGE_NAME`.\n\nThe following example demonstrates building a work request that is bound to a\nspecific process: \n\n### Kotlin\n\n```kotlin\nval PACKAGE_NAME = \"com.example.background.multiprocess\"\n\nval serviceName = RemoteWorkerService::class.java.name\nval componentName = ComponentName(PACKAGE_NAME, serviceName)\n\nval data: Data = Data.Builder()\n .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName)\n .putString(ARGUMENT_CLASS_NAME, componentName.className)\n .build()\n\nreturn OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java)\n .setInputData(data)\n .build()\n```\n\n### Java\n\n```java\nString PACKAGE_NAME = \"com.example.background.multiprocess\";\n\nString serviceName = RemoteWorkerService.class.getName();\nComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName);\n\nData data = new Data.Builder()\n .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName())\n .putString(ARGUMENT_CLASS_NAME, componentName.getClassName())\n .build();\n\nreturn new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class)\n .setInputData(data)\n .build();\n```\n\nFor each `RemoteWorkerService`, you also need to add a service definition in\nyour `AndroidManifest.xml` file: \n\n```xml\n\u003cmanifest ... \u003e\n \u003cservice\n android:name=\"androidx.work.multiprocess.RemoteWorkerService\"\n android:exported=\"false\"\n android:process=\":worker1\" /\u003e\n\n \u003cservice\n android:name=\".RemoteWorkerService2\"\n android:exported=\"false\"\n android:process=\":worker2\" /\u003e\n ...\n\u003c/manifest\u003e\n```"]]