LYnLab

블로그취미로그

[무작정 코틀린 01] RxJava와 섞어쓰기

[무작정 코틀린 01] RxJava와 섞어써보았다 더 나은 방법에 대한 의견이나 질문은 언제든지 환영합니다.

2017-05-30#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

구현 목표

  • 버스 노선 번호를 입력할 수 있는 입력창 (DONE)
  • 노선 검색 버튼 (DONE)
  • 검색 버튼을 누르지 않아도, 글자 입력할 때마다 자동 검색
  • 검색 결과를 목록으로 보여주며, 결과를 누르면 다음 화면으로 이동

중간 결과물

Github 레포지토리에서 코드 보기

package com.lynlab.restbus.view.fragment

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import com.lynlab.restbus.R
import com.lynlab.restbus.api.RestApi
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers

/**
 * 노선 검색 프래그먼트
 */
class SearchRouteFragment : Fragment() {

    private var restApi = RestApi()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_search_route, container, false)

        // 검색 Observable 추가
        val searchEditText = view.findViewById(R.id.edittext_search_route) as EditText
        val observable: Observable<String> = Observable.create({ emitter ->
            emitter.onNext(searchEditText.text.toString())
        })

        // 검색 Subscriber 설정
        val searchButton = view.findViewById(R.id.button_search_route) as Button
        searchButton.setOnClickListener({ observable.subscribe({ query -> requestRoutes(query) }) })

        return view
    }

    /**
     * 검색을 요청, 처리한다.
     */
    fun requestRoutes(query: String) {
        restApi.getRoutes(query)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        { routes -> Toast.makeText(context, "${routes.size} result(s)", Toast.LENGTH_SHORT).show() },
                        { _ -> Toast.makeText(context, R.string.toast_error_network, Toast.LENGTH_SHORT).show() }
                )
    }

}

여담

  1. MVVM은 안할 생각이다. 좋은 디자인 패턴이긴 하지만, 화면 3개짜리 소규모 프로젝트에서는 지나치게 생산성을 떨어뜨린다고 판단했기 때문이다.
  2. 그래도 뷰와 로직을 최대한 분리하고 싶긴 했는데, 아직은 코틀린과 데이터 바인딩을 동시에 사용할 수가 없어 어려움이 많다. 일단 고전적인 방법으로 구현했다.
  3. "(검색버튼 클릭 | 자동완성) → API 요청 → 결과 띄우기" 의 플로우가 RxJava의 Pub-Sub으로 연결되어있다. 적당히 깔끔하게 설계된 것 같다.

더 나은 방법에 대한 의견이나 질문은 언제든지 환영합니다.

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2024 Hoerin Doh, All rights reserved.

LYnLab 로고GitHubTwitterInstagram