inflearn logo
강의

Course

Instructor

Frozen Coder's Easy Introduction to Modern Android Development

Applying Paging to Practice8A-Room Response (Pager, PagingDataAdapter)

searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.

352

hth08935115

1 asked

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)
        }
    }

android kotlin 아키텍처 jetpack

Answer 1

0

frozencoder

Handler는 메인 스레드에서 동작하므로, 만약 검색 동작이 시간이 오래 걸리는 경우 UI가 응답하지 않을 수 있습니다. 차라리 코루틴으로 searchJob을 정의해서 작업을 제어 해 보세요.

2

hth08935115

감사합니다. 아래처럼 바꿨어요! 😃

    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
                    }
                }
            }
        }
    }

 

Coroutine, Flow 질문

0

379

1

Transformations import 안됨

0

570

1

moshi관련 질문입니다.

0

539

2

안드로이드에서 아키텍처 패턴

0

403

1

RecyclerView.Adapter vs ListAdpater

0

459

1

Flows 와 Coroutine

1

554

1

[BookSearchAdapter] onBindViewHolder의 currentList[position] 질문

0

357

1

코루틴 메모리 관련해서 질문드립니다!

0

441

1

Java Bill Pugh Solution 에서 INSTANCE

0

457

1

nested json에서 특정 부분만 파싱하는법

0

484

1

Fragment에서의 viewBinding

0

511

3

toolbar 질문드립니다.

0

402

2

EditText 에서 delay 주셔서 처리하셨는데 flow 의 debounce() 하고 같은건가요?

2

559

1

코루틴 관련 질문

0

538

1

오류

1

488

2

강사님! 직렬화 라이브러리를 Moshi, kotlin serialization 두개를 사용하시던데 이유가 있으신가요?

1

737

1

EditText 는 kill 해도 값이 잘 저장되어있던데 혹시 제가 잘못테스트했을까요?

1

342

1

서버도 페이징 기능이 되는데 Paging 라이브러리가 필요할까요?

1

519

1

GSON 이 아닌 Moshi 를 사용하시는 이유가 있을까요?

1

1262

1

EditText 는 액티비티가 재생성되어도 값이 남아있던데 이유가 궁금해요

1

491

1

ViewModel 생성시 왜 초기값을 받지 않도록 했을까요?

1

431

1

Room DB에 id 항목 추가

0

246

1

안녕하세요. 용어에 대해 질문이 있어 글 남깁니다.

0

395

2

paging config pageSize 관련

0

421

1