Android에서 Reactive 맛보기
728x90
반응형

 

안드로이드 코딩만 하는 나에게 함수형 프로그래밍은 두루뭉실한 개념이다. 객체지향 프로그래밍만 코딩이라고 생각하고 작업을 해왔으니... 알고리즘만 있는 명령형 프로그래밍은 목표가 없기 때문에 "지향"이라는 단어를 쓰는게 아닐까 싶다. 하지만 함수형 프로그래밍은 선언형이라고 부르며 무엇(What)을 하겠다는 선언할 대상인 목표가 생긴다. 이를 잘 정리한 블로그를 통해 추가 학습을 하길 바란다.

 

리액티브라고 부르는 이 프로그래밍은 Rx(Reactive extension) 혹은 FRP(Functional reactive programming)에서 파생된 말이다. 비동기적, 반응형, 고차함수 등의 특징을 가지는 프로그래밍이기에 함수형 프로그래밍을 설명하였다. 보시다싶이 FRP에는 함수(Function)도 들어가 있으니.

 

본격적으로 Rx에 혀(?)를 가져다대기 전에 기본적인 학습을 해야할텐데. 내가 설명을 다 하기는 귀... 역량이 모자라므로 좋은 설명을 해주고 있는 분들의 링크를 걸어둘테니 그것부터 살짝 핥아(!)보고 오시길 바란다.

위 두 분의 블로그를 통해 학습한 결과로 과거에 Thread로 만든 간단한 디지털 시계 앱을 수정해 보았다. 해당코드는 아래 링크를 참고해주시길. (https://github.com/conquerex/RedBlueClock)

 

conquerex/RedBlueClock

색깔이 바뀌는 시계. Contribute to conquerex/RedBlueClock development by creating an account on GitHub.

github.com

원래는 runningClock이라고 함수에서 Thread를 비동기 처리하여 시계의 시간을 실시간으로 UI에 반영하도록 한 것이다. 이것을 Rx의 비동기 처리로 변경한 것이다. "학습용 코드"라고 주석처리 되어 있는 부분은 이 포스트를 보는 분들도 주석을 풀어서 학습하는데 도움이 되었으면 한다.

  // Observable
  val timeSetting = Observable
      .interval(1000L, TimeUnit.MILLISECONDS) // 1초에 숫자를 하나씩 발행 (0, 1, 2...)
      .map { it.toInt() } // Long to Int
      .take(6) // 10개만 발행
  val obs = timeSetting.publish()

  // Schedulers을 통해 동작할 스레드 지정
  obs.subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())

  //===== 생략 ======

  // 1. onNext만 사용하는 경우
  obs.subscribe { t -> Log.d(TAG, "* * * " + t.toString()) }

  // 2. onNext, onError, onComplete 모두 사용하는 경우
  obs.subscribe(Consumer {
      Log.d(TAG, "* * * next :: " + it.toString())
  }, Consumer {
      Log.d(TAG, "* * * error :: " + it.toString())
  }, Action {
      Log.d(TAG, "* * * complete :: Done")
  })

리액티브 프로그래밍에 가장 중요한 세가지가 여기에 다 나온다.

  • 첫번째 주석, Observable : 데이터를 송신하는 입장. 설정된 시기동안 데이터를 Observers에 전달한다.
  • 두번째 주석, Schedulers : 비동기 처리를 위한 것. Observable과 Observers가 수행할 쓰레드 위치를 알려준다. 참고로 io()는 동기 I/O를 별도로 처리시켜 비동기 효율을 얻기 위한 스케줄러이다. (Realm 블로그 참고)
  • 1, 2 주석, Observers : 데이터를 수신하는 입장. Observable을 구독한다고도 한다. Json 응답 파싱부터 UI 반영까지 여러 작업을 수행할 수 있다.

 

참고자료
- 제레미의 블로그
- realm 블로그

 

728x90
반응형