본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] RxJava가 뭐야? 맛보기!

by 돼지왕 왕돼지 2018. 3. 9.
반응형

[android] RxJava가 뭐야? 맛보기!


https://medium.com/@LIP/rxjava-29cfb3ceb4ca#.9nadkqnzx

http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

Android, boiler plate, c#, code chaning, CONSUME, emit, item 발행, just, jvm, LAMBDA, map, MS, observable, observable.from, observable.just, oncomplete, onerror, onnext, reactive, reactive extensions, reactive programming, RX, rxandroid, rxjava, subscribe, subscriber, [android] RxJava가 뭐야? 맛보기!, 발행, 비동기 처리, 소비, 이벶트 기반


-

RxJava 란 Reactive Programming 을 위한 라이브러리인 Rx(Reactive Extensions)의 JVM 판이다.

Rx 라는 녀석은 C# 에서 처음 개념이 나왔다고 볼 수 있다.

Rx 란 비동기처리와 이벤트기반의 프로그램 개발을 위해 유용한 기능들을 제공하는 확장판이라고 볼 수 있다.



-

Reactive(반응적인) 코드의 기본적인 구성 요소는 Observable 들과 Subscriber 들이다.

Observable 은 아이템들을 발행(emit) 하고, Subscriber 는이 아이템들을 소비(consume)한다.


아이템들이 발행되는 방법에는 패턴이 있다.

Observable 은 어떠한 개수의 아이템이라도 발행 할 수 있고, 성공적인 완료 또는 에러에 의해 종결된다.

Observable 이 가지고 있는 각각의 Subscriber 들에 대해 onNext() 를 몇 번 호출하고 onComplete() 또는 onError() 가 뒤따른다.


표준적인 옵저버 패턴과 닮아 보이지만, 중요한 한가지가 다르다.

Observable 은 보통 누군가 명시적으로 subscribe 하기 전까지 아이템을 발행하지 않는다.



-

Observable<String> myObservable = Observable.create(

  new Observable.OnSubscribe<String>() {

    @Override

    public void call(Subscriber<? super String> sub) {

      sub.onNext(“Hello, world!”);

      sub.onCompleted();

    }

  }

);


Subscriber<String> mySubscriber = new Subscriber<String>() {

  @Override

    public void onNext(String s) { System.out.println(s); }

  @Override

    public void onCompleted() { }

  @Override

    public void onError(Throwable e) { }

};


myObservable.subscribe(mySubscriber);


위의 코드들이 RxJava 를 이용하면 간단해진다. ( boiler plate 제거 )

Observable<String> myObservable = Observable.just(“Hello, world!”); // 정확히 동일한 동작은 아니다만..


Action1<String> onNextAction = new Action1<String>() { // action 은 subscriber 의 각 파트를 정의한다.

  @Override

  public void call(String s) {

    System.out.println(s);

  }

};


myObservable.subscribe(onNextAction); // onErrorAction, onCompleteAction 도 , 를 붙여 설정할 수 있다.


이 코드는 다시 chaining 으로 간단해질 수 있다.

Observable.just(“Hello, world!”)

  .subscribe(new Action1<String>() {

    @Override

    public void call(String s) {

      System.out.println(s);

    }

  });


이 흉칙한 코드가 Lamda 를 만나게 되면.. 더 간단해진다.

Observable.just(“Hello, world!”).subscribe(s -> System.out.println(s));



-

RxJava 를 이용하면 3rd part lib 의 Observable 을 사용하는 경우에 대해서 hooking 과 같은 기술도 가능하다.

observable.just(“Hello, world!”)

  .map(new Func1<String, String>() {

    @Override

      public String call(String s) {

        return s + “ -Dan”;

      }

    })

  .subscribe(s -> System.out.println(s));


map 으로 전달된 함수를 통해 Hello, world! 에 -Dan 이 붙게 한 후 subscribe 에 전달이 된다.

물론 Lambda 를 이용해 아래와 같이 더 단순화될 수 있다.

Observable.just(“Hello, world!”)

 .map(s -> s + “ -Dan”)

 .subscribe(s -> System.out.println(s));


다음과 같이 type 을 변경해서 줄 수도 있다.

Observable.just(“Hello, world!”)

  .map(new Func1<String, Integer>() {

    @Override

      public Integer call(String s) {

        return s.hashCode();

      }

    })

  .subscribe(i -> System.out.println(Integer.toString(i)));


간단히..

Observable.just(“Hello, world!”)

  .map(s -> s.hashCode())

  .subscribe(i -> System.out.println(Integer.toString(i)));



-

RxJava 를 Android 에 더 알맞게 포팅시켜 놓은 RxAndroid 란 녀석도 있다.



-

기존 코드를 RxJava 패턴으로 사용하려면 대부분 Observable.just() 와 Observable.from() 이 2개면 충분하다.





반응형

댓글