Rxjava를 통한 retry, delay 정리

WWWKR·2023년 6월 14일
0

문제 상황
알람 매니저를 통해 예약된 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)
profile
안드로이드 개발자

0개의 댓글