메소드를 중복실행 방지 시키려면?
Search
🎨

메소드를 중복실행 방지 시키려면?

생성일
2021/09/06 08:19
태그
RecyclerView 스크롤 최하단에 내려 갔을 때 특정 메소드를 실행시켜주려 한다.
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (!binding.recyclerView.canScrollVertically(1)) { thisMethod() } } })
Kotlin
thisMethod()가 두번 실행되는 경우가 있어 이를 해결하려 시도했다.

Debounce를 걸어볼까?

fun debounce(timeMillis: Long, method:()->Unit) { CoroutineScope(Dispatchers.IO).launch { delay(timeMillis) method.invoke() } }
Kotlin
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (!binding.recyclerView.canScrollVertically(1)) { debounce(50) { thisMethod() } } } })
Kotlin
중복 실행 되는 경우는 없으나 잘못된 코드일까, 더 좋은 코드가 있지 않을까 싶어 질문했다(to Jay)
결론은 Debounce보다 다른 방법이 더 적합하다!

Flag를 주는 것이 더 적합할 것 같다.

ProgressBar를 visible 시킬지 gone 시킬지 LoadingManager라는 것을 통해 전달해 사용하고 있었는데(서버에 request할 때 isLoading true, 응답이 왔을 때 isLoading false) 이 LoadingManager를 이용해 Flag를 주기로 했다.
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (!binding.recyclerView.canScrollVertically(1) && viewModel.getCurrentLoadingState().not()) { thisMethod() } } })
Kotlin
더 적합한 방법으로 변경했다.