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

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

2017. 05. 30.

구현 목표

  • 버스 노선 번호를 입력할 수 있는 입력창 (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으로 연결되어있다. 적당히 깔끔하게 설계된 것 같다.

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

크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab