Android 는 Kotlin API 를 사용 하여 WorkManager 를 실행 합 니 다.
6641 단어 AndroidWorkManagerKotlinAPI
WorkManager 기반
어떤 작업 이 실행 상 태 를 유지 해 야 할 때 사용자 가 다른 인터페이스 로 전환 하거나 사용자 가 응용 프로그램 을 배경 으로 전환 하 더 라 도 장치 가 다시 시작 할 때 작업 상태 에 영향 을 주지 않 으 므 로 WorkManager 를 사용 하 는 것 을 추천 합 니 다.유사 한 응용 장면 은 다음 과 같다.
이 WorkManager codelab 튜 토리 얼 에 서 는 그림 을 모호 하 게 처리 하고 처리 한 데 이 터 를 디스크 에 저장 합 니 다.우 리 는 이 과정 에서 어떤 조작 이 필요 한 지 보 자.
work-runtime-ktx 의존 추가:
// https://developer.android.google.cn/jetpack/androidx/releases/work
def work_version = "2.5.0"
implementation "androidx.work:work-runtime-ktx:$work_version"
우선 우리 자신의 Worker 클래스 를 실현 합 니 다.우 리 는 여기에서 진정 으로 백 스테이지 에서 업 무 를 수행 해 야 하 는 코드 를 실현 할 것 이다.Worker 클래스 를 확장 하고 doWork()방법 을 복사 할 수 있 습 니 다.이런 종류 가 매우 중요 하기 때문에 우 리 는 뒤의 내용 에서 상세 하 게 소개 할 것 이다.이것 은 그것 의 최초의 실현 코드 이다.
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
class BlurWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
override fun doWork(): Result {
val resourceUri = inputData.getString(KEY_IMAGE_URI)
return try {
if (resourceUri.isNullOrEmpty()) {
Timber.e("Invalid input uri")
throw IllegalArgumentException("Invalid input uri")
}
val outputData = blurAndWriteImageToFile(resourceUri)
Result.success(outputData)
} catch (throwable: Throwable) {
Timber.e(throwable, "Error applying blur")
Result.failure()
}
}
…
}
그 다음 에 우리 의 work 요청 을 만 듭 니 다.이 예 에서 우 리 는 전체 작업 이 한 번 만 실행 되 기 를 바 랍 니 다.그래서 우 리 는OneTimeWorkRequest.Builder을 사용 하여 모호 화 처리 가 필요 한 그림 의 Uri 를 매개 변수 로 전송 합 니 다.Kotlin 팁:입력 데 이 터 를 만 들 려 면 워 크 데이터 오 브 함 수 를 사용 할 수 있 습 니 다.데이터 구축 기 를 만 들 고 키 쌍 을 채 워 서 데 이 터 를 만 들 수 있 습 니 다.
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
val blurBuilder = OneTimeWorkRequestBuilder<BlurWorker>()
val data = workDataOf(KEY_IMAGE_URI to imageUri.toString())
blurBuilder.setInputData(data)
저 희 는 WorkManager 클래스 를 사용 하여 위 에서 한 작업 을 계획 대기 열 에 추가 하고 실행 합 니 다.우 리 는 실행 해 야 할 임무 와 이 임무 들 의 제한 조건 을 제공 할 수 있다.
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
val workManager = WorkManager.getInstance(application)
val continuation = workManager.beginUniqueWork(blurBuilder.build())
//
continuation.enqueue()
Worker 로 하여 금 작업 을 시작 하 게 합 니 다.Worker 를 사용 할 때 WorkManager 는 배경 스 레 드 에서 Worker.do Work()를 자동 으로 호출 합 니 다.doWork()가 되 돌아 오 는 Result 는 WorkManager 서비스 가 성 공 했 는 지,실패 하면 다시 시도 해 야 하 는 지 알려 줍 니 다.
Worker.do Work()는 동기 호출 에 속 합 니 다.배경 작업 은 차단 방식 으로 실행 되 어야 하 며 모든 작업 은 전체 doWork()함수 가 끝 날 때 완료 해 야 합 니 다.doWork()에서 비동기 API 를 호출 하고 결 과 를 되 돌려 주면 리 셋 함수 의 실행 에 문제 가 생 길 수 있 습 니 다.
근 데 제 가 비동기 작업 을 하고 싶 으 면 어 떡 하 죠?
우 리 는 위의 예제 작업 을 복잡 하 게 만 들 었 다.예 를 들 어 나 는 데이터베이스 에 모호 하 게 처 리 된 모든 파일 을 저장 하고 싶 은 Uri 이다.
그래서 만 들 었 습 니 다:
데이터베이스 에 데 이 터 를 저장 하거나 네트워크 요청 을 하 는 등 비동기 작업 이 필요 하 다 면 Kotlin 에 서 는 CorotineWorker 를 사용 하 는 것 을 추천 합 니 다.
CorotineWorker 는 Kotlin 협 정 을 사용 하여 비동기 임 무 를 수행 합 니 다.
doWork()방법 은 suspend 방법 입 니 다.즉,여기 서 걸 수 있 는 dao 함 수 를 호출 할 수 있 습 니 다.
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
class BlurWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
override suspend fun doWork(): Result {
val resourceUri = inputData.getString(KEY_IMAGE_URI)
return try {
if (resourceUri.isNullOrEmpty()) {
Timber.e("Invalid input uri")
throw IllegalArgumentException("Invalid input uri")
}
val outputData = blurAndWriteImageToFile(resourceUri)
// uri
val imageDao = ImagesDatabase.getDatabase(applicationContext).blurredImageDao()
imageDao.insert(BlurredImage(resourceUri))
Result.success(outputData)
} catch (throwable: Throwable) {
Timber.e(throwable, "Error applying blur")
Result.failure()
}
}
...
}
doWork()는 기본적으로 Dispatchers.Default 를 사용 합 니 다.필요 한 Dispatcher 로 바 꿀 수 있 습 니 다.여기 서 우 리 는 이렇게 할 필요 가 없습니다.왜냐하면 Room 은 이미 데 이 터 를 다른 Dispatcher 에 삽입 하여 작업 을 완 료 했 기 때 문 입 니 다.더 많은 관련 내용 은 Room Kotlin API 를 참고 하면 된다.CorotuneWorker 를 사용 하여 비동기 작업 을 시작 합 니 다.사용자 가 프로그램 을 닫 아 도 작업 이 완 료 될 수 있 습 니 다.
WorkManager 에 대한 내용 을 더 알 고 싶다 면 미래 에 관 한 글 을 주목 하 십시오.그 전에 codelab 와 문 서 를 방문 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.