Android 는 Kotlin API 를 사용 하여 WorkManager 를 실행 합 니 다.

WorkManager일련의 API 를 제공 하여 비동기 임 무 를 더욱 편리 하 게 계획 할 수 있 습 니 다.응용 이 닫 히 거나 장치 가 재 개 된 후에 도 즉시 실행 되 거나 지연 되 는 임 무 를 정상적으로 처리 해 야 합 니 다.Kotlin 개발 자 에 게 WorkManager 는 협 정 에 최고의 지원 을 제공 합 니 다.본 논문 에서 저 는 WorkManager codelab 를 실천 하여 여러분 께WorkManager에서 협 정 과 관련 된 기본 적 인 조작 을 보 여 드 리 겠 습 니 다.그럼 시작 해 볼 까요?
WorkManager 기반
어떤 작업 이 실행 상 태 를 유지 해 야 할 때 사용자 가 다른 인터페이스 로 전환 하거나 사용자 가 응용 프로그램 을 배경 으로 전환 하 더 라 도 장치 가 다시 시작 할 때 작업 상태 에 영향 을 주지 않 으 므 로 WorkManager 를 사용 하 는 것 을 추천 합 니 다.유사 한 응용 장면 은 다음 과 같다.
  • 로그 업로드 또는 보고 데이터
  • 필터 로 그림 을 처리 하 는 동시에 그림 저장
  • 네트워크 를 통 해 로 컬 데 이 터 를 정기 적 으로 동기 화 합 니 다.
  • 만약 에 귀하 의 실시 간 작업 이 사용자 가 특정한 역할 영역 에서 벗 어 날 때 끝 날 수 있 습 니 다.예 를 들 어 다른 인터페이스 로 전환 할 수 있다 면 저 희 는 Kotlin 협 정 을 직접 사용 하 는 것 을 권장 합 니 다.
    이 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 이다.
    그래서 만 들 었 습 니 다:
  • 간단 한 Blurred Image 실체
  • 그림 을 삽입 하고 가 져 오 는 DAO 클래스
  • 데이터베이스
  • 관련 실현 코드여 기 를 클릭 하 세 요..
    데이터베이스 에 데 이 터 를 저장 하거나 네트워크 요청 을 하 는 등 비동기 작업 이 필요 하 다 면 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 와 문 서 를 방문 할 수 있 습 니 다.
  • WorkManager 문서
  • Codelab|WorkManager 사용
  • Codelab|WorkManager 진급
  • 이상 은 안 드 로 이 드 가 Kotlin API 를 사용 하여 WorkManager 를 실천 하 는 상세 한 내용 입 니 다.안 드 로 이 드 실천 WorkManager 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기