문제 상황
알람 매니저를 통해 예약된 API를 호출 하는데 와이파이 상태로 호출이 되면 안 되는 상황이다.
기존 개발자가 와이파이를 강제로 해제 하고 모바일 데이터를 연결 하는 코드를 넣어 놨는데
와이파이가 해제 되고 모바일 데이터가 연결 되는 사이에 딜레이가 있다 보니 그 사이에 API가 호출되면서 톻신이 안되는 문제가 생겼다.
해결
시도1.
처음 시도 해본 방법은 반복문을 통해 와이파이 연결 상태를 체크 하고 연결이 되어 있지 않다면 break
아닌 경우에 와이파이 해제 후 모바일 데이터 연결을 시도 하고 Thead.sleep(1000) 를 통해 딜레이를 줬다.
val maxRetryCount = 3
for (retryCount in 1..maxRetryCount) {
if (!checkConnectionToWifi(context)) {
break
}
forceConnectionToMobile(SLXApplication.instance.applicationContext)
Thread.sleep(1000)
}
코드를 작성한 후 Thead.sleep 관련 이슈가 우려되어 코드를 다시 Rx로 변경 했다.
시도2
Single.create를 사용 하여 데이터 스트림을 만든 후 와이파이 연결 체크 -> 해제 후에
retry와 delay를 추가하여 스트림 자체에서 재시도 및 딜레이 시간을 관리 하도록 했다.
val wifiDisconnect = Single.create<Unit> { emitter ->
if(CommonUtil.checkConnectionToWifi(applicationContext)){
CommonUtil.forceConnectionToMobile(applicationContext)
emitter.onError(Exception("와이파이 연결"))
}else{
emitter.onSuccess(Unit)
}
}
.retry(3)
.delay(1000, TimeUnit.MILLISECONDS)