WorkManager에서 suspend 함수 사용 시 두 번 호출 문제

반응형
728x170

1. 문제 현상

 

CoroutineWorker를 사용하는데

 

이 클래스 내부에서 suspend 함수를 호출하면

 

해당 suspend 함수를 완료하고 나서 다시 돌아오는 현상이 발생했다....

 

예를 들어 아래의 사진을 보면

 

 

doWork 함수 내에서 tartgetAlarmData를 collect하는데

 

이때 비동기 작업을 한다(suspend funtion)

 

그리고 해당 collect 내부에선 Activity를 띄우는데 

 

문제는 Activity를 닫고나서 다시 targetAlarmData를 collect한다

 

(ReceiverAlarmWork 클래스나 doWork 함수부터 시작하는게 아님, targetAlarmData를 collect하는 부분부터 시작함...)

300x250

2. 해결 방법

 

원하는 타이밍에 해당 workManager를 stop 시켜주면된다

 

하지만 특정 workManager를 지정하기 위해선 해당 workManager에 이름을 붙여줘야한다

 

enqueueUniqueWork("uniqueWorkName", ExistingWorkPolicy, OneTimeWorkRequest)

enqueueUniqueWork 함수를 사용해서 시작하려는 workManager에 이름을 붙일 수 있다

 

여기선 uniqueWorkName을 "onAlarmActivity"로 하였다

 

그리고 workManager는 onAlarmActivity를 열기 때문에 거기서 이 work를 cancel해주면 된다

 

아래의 함수를 onAlarmActivity의 onCreate()에서 호출하면 더 이상 ReceiverAlarmWorker가 동작하지 않는다

 

반응형

댓글()