-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
미해결
searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.
24.01.13 18:43 작성 24.01.13 18:57 수정 조회수 117
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
아래 코드를
private fun searchBooks() {
var startTime = System.currentTimeMillis()
var endTime: Long
binding.etSearch.text =
Editable.Factory.getInstance().newEditable(searchViewModel.query)
binding.etSearch.addTextChangedListener { text: Editable? ->
endTime = System.currentTimeMillis()
if (endTime - startTime >= SEARCH_BOOKS_TIME_DELAY) {
text?.let {
val query = it.toString().trim()
if (query.isNotEmpty()) {
searchViewModel.searchBooksPaging(query)
searchViewModel.query = query
}
}
}
startTime = endTime
}
}
아래처럼 바꿔봤는데 입력 시마다 runnable을 매번 생성하는데 문제 되진 않을까요? 코틀린에 익숙치 않아서 더 좋은 방법이 있다면 알고 싶습니다.
private var handler: Handler = Handler(Looper.getMainLooper())
var runnable: Runnable? = null
private fun searchBooks() {
binding.etSearch.addTextChangedListener { text: Editable? ->
if (runnable != null) {
handler.removeCallbacks(runnable!!)
}
// 텍스트 입력 후 N 초 간 입력 없으면 검색 실행
runnable = Runnable {
text?.let {
Log.d(TAG, "text:$it");
val query = text.toString().trim()
if (query.isNotEmpty()) {
bookSearchViewModel.searchBooks(text.toString())
bookSearchViewModel.query = query
}
}
}
handler.postDelayed(runnable!!, Constants.SEARCH_BOOKS_TIME_DELAY)
}
}
냉동코더의 알기 쉬운 Modern Android Development 입문
Practice8A-Room 응답에 Paging 적용하기 (Pager, PagingDataAdapter)
강의실 바로가기
답변을 작성해보세요.
0
냉동코더
지식공유자2024.01.14
Handler
는 메인 스레드에서 동작하므로, 만약 검색 동작이 시간이 오래 걸리는 경우 UI가 응답하지 않을 수 있습니다. 차라리 코루틴으로 searchJob
을 정의해서 작업을 제어 해 보세요.
태희
질문자2024.01.14
감사합니다. 아래처럼 바꿨어요! 😃
private var job: Job? = null
private fun searchBooks() {
binding.etSearch.addTextChangedListener { text: Editable? ->
job?.cancel()
job = CoroutineScope(Dispatchers.Default).launch {
delay(Constants.SEARCH_BOOKS_TIME_DELAY)
text?.let {
Log.d(TAG, "text:$it");
val query = text.toString().trim()
if (query.isNotEmpty()) {
bookSearchViewModel.searchBooksPaging(text.toString())
bookSearchViewModel.query = query
}
}
}
}
}
답변 1