진행중인 프로젝트에서 사용자의 액션이 있을때마다 broadcast를 보내고, 마지막으로 받은 broadcast action으로 상태를 업데이트하는 기능이 필요하게 되었습니다.
broadcast를 수신할때마다 업데이트를 하는 방법도 있겠지만, resume이 되었을때 마지막으로 받은 action만 업데이트하는 방식으로 개발해보기로 했습니다.
이를 위해서는 debounce가 딱이지만, 이를 broadcast receiver에 붙일수도 없으니.. 같은 기능을 하는 것을 만들어보기로 했습니다.
일단, debounce는 여러 입력을 약간의 딜레이로 기다렸다가, 입력이 없으면 전송하는 기능을 가지고 있습니다.
이와 비슷하게, 수신한 broadcast 를 가지고 있다가 resume이 되었을때 약간의 딜레이로 입력을 받고, 입력이 없으면 마지막 입력값을 전달하는 것으로 생각하였습니다.
var debounceJob: Job? = null
override fun onReceive(context: Context?, intent: Intent?) {
when(intent.action) {
Constants.INTENT_ACTION_UPDATE -> { // 사용자 응답 업데이트
lifecycleScope.launchWhenResumed {
debounceJob?.cancel()
debounceJob = launch {
delay(300)
// TO-DO. intent로 사용자 액션 처리
}
}
}
}
}
위와같이 구현을 완료하였습니다.
lifecycleScope.launchWhenResumed{} 를 이용하여, resume이 되었을때 쌓여있던 broadcast가 호출되게 됩니다.
그러면, debounceJob을 이용하여 coroutine delay 300ms를 대기하고 있다가, 새로운 입력이 들어오면, 기존 debounceJob을 cancel하고 새로운 coroutineScope.launce{} 가 생성되고, 다시 300ms 대기.. 이걸 반복하여 최종으로 300ms 동안 입력이 없으면 그 값을 다음으로 전달하게 됩니다.
이를 통해 마지막 broadcast 값만을 전달받아 처리를 할수 있게 되었습니다.
'Android + Kotlin' 카테고리의 다른 글
[Android+Kotlin] Logcat 로그 전체 보기 팁 (잘림현상 극복~) (0) | 2023.01.16 |
---|---|
Linkify 에서 WEB_URL 패턴을 커스텀해보자. (0) | 2023.01.15 |
RecyclerView Adapter 안에서 click().throttleFirst() 사용하는 방법 (0) | 2023.01.11 |
손쉽게 Int, Float 를 dp로 변환하는 extension 코드 (0) | 2022.12.29 |
[Android + Kotlin] PagingDataAdapter에서 "좋아요"를 해보자. (payload update) (0) | 2022.08.29 |