RxJava 학습회 Week1

12460 단어 RxJava

카탈로그

  • ReactiveX
  • Sync vs Async
  • RxJava
  • Operators
  • ReactiveX


    이른바 ReactiveX

  • 비동기 프로그램용 라이브러리
  • 다중 데이터(이벤트) 중심
  • Observable Sequence 사용
  • 저층(threading,synchronization,thread-safety,conceurrency...)숨기기
  • ReactiveX용 Java 설치: RxJava
  • ref: http://reactivex.io/intro.html

    Sync vs Async


    동기화 프로그래밍


    단일 데이터 가져오기: T getData()
    // 単一データを同期的に取得して出力
    Integer i = getData();
    System.out.println(i);
    

    동기화 프로그래밍


    여러 데이터 가져오기: Iterable<T> getData
    // 複数データを同期的に取得して出力
    Iterable<Integer> iter = getData();
    for (Integer i : iter) {
        System.out.println(i);
    }
    

    문제.

  • getData()를 통해 처리 차단
  • 여러 데이터: 모든 데이터가 정렬되지 않으면 출력할 수 없음
  • 비동기 프로그래밍


    단일 데이터: Future<T> getData()
    Future<Integer> f = getData();
    ...(その他の処理)...
    Integer i = f.get();
    System.out.println(i);
    

    비동기 프로그래밍


    여러 데이터 가져오기: Observable<T> getData();
    Observable<Integer> observable = getData();
    observable.subscribe(i -> System.out.println(i));
    ...(その他の処理)...
    

    장점

  • getData()를 통해 처리를 차단하지 않음
  • 다수의 데이터: 모든 데이터가 일치하지 않아도 처리
  • 이른바 ReactiveX

  • 비동기 프로그램× 다중 데이터
  • 디자인 패턴의 Observer Pattern을 다중화한 패턴
  • Observables 중심
  • 모든 구현 가능
  • 단일 스레드, 다중 스레드, Actor 모델,,,
  • RxJava


    RxJava

  • Reactive X JVM용 라이브러리
  • Java로 구현
  • 1.x와 2.완전히 다르다
  • 2.x중심해설
  • 차리다

  • gradle에서 다음 설정
  • compile "io.reactivex.rxjava2:rxjava:2.0.4"
    

    샘플 코드

  • Pure Java
  • github: TODO
  • Observable 생성

    // 配列を元にして Observable を生成
    Integer[] numbers = {1, 2, 3, 4, 5};
    Observable<Integer> observable 
        = Observable.fromArray(numbers);
    
    ● Observable에는 많은 factory 방법이 있음

    subscribe

    // Observables を subscribe する
    observable.subscribe(new Consumer<Integer>() {
        @Override 
        public void accept(Integer integer) throws Exception {
            System.out.println(integer);
        }
    });
    

    실행하면

    1
    2
    3
    4
    5
    

    단일 Item의 Observable

    // 単一アイテムの Observable
    Observable<Integer> observable = Observable.just(1);
    
    ⇒ 2.x에서는 Single 을 사용하는 것이 좋습니까?(확인 필요)

    Java 8의 λ 활용

    // Java 8 のラムダ構文
    observable.subscribe(integer -> {
        System.out.println(integer);
    });
    
    방법 참조가 더 간단
    observable.subscribe(System.out::println);
    

    비동기 처리

    // 5秒後に 1 を生成する Observable
    Future<Integer> future = Executors.newSingleThreadExecutor().submit(() -> {
        // バックグラウンドスレッドで実行
        Thread.sleep(5000);
        return 1;
    });
    
    Observable<Integer> observable = Observable.fromFuture(future);
    observable.subscribe(System.out::println); // 終了しないので注意
    

    Operators


    모음 작업

  • ReactiveX의 모음 작업이 중요함
  • ReactiveX→Observables 중심
  • Observables→비동기× 다중 데이터
  • 여러데이터♥컬렉션
  • 간편한 컬렉션 방법 마련
  • 예:


    'N transformed'의 형식으로 11~15개의 데이터 열을 순서대로 출력하는 요소

    싱크로율

    Iterable<T>의 경우:
    Iterable<Integer> iter = getDataFromLocal();
    iter.skip(10)
      .take(5) 
      .map(s -> s + "transformed") 
      .forEach(s -> System.out.println(s));
    

    비동기적인 수법

    Observable<T>의 경우:
    Observable<Integer> observable = getDataFromNetwork();
    observable.skip(10)
      .take(5) 
      .map(i -> i + "transformed") 
      .subscribe(s -> System.out.println(s));
    

    Marble Diagrams

  • 방법의 효과 설명에 사용되는 그림

  • ref: http://reactivex.io/documentation/observable.html

    Pull vs Push

  • Pull
  • 동기화 방법은 Pull
  • 데이터를 사용하는 측이 데이터를 Pull
  • Push
  • 비동기식 접근 방식은 Push
  • 데이터를 생성한 측이 데이터를 Push
  • 모든 것을 Push로 바꾸다


    ReactiveX 설립자 Erik Meijer:
    그는 세계 최전방을 계속 걷고 싶다면 반드시'push', 즉 적극적이고 주동적이어야 한다고 말했다.그는'풀'을 사용하는 것은 기본적으로 프로그램에 각양각색의 차단점을 넣기 때문에 효율이 매우 낮다고 말했다.
    ref: https://www.infoq.com/jp/news/2015/12/erik-meijer-hacker-way

    다음번

  • Android에서 ReactiveX를 사용합니까?
  • 좋은 웹페이지 즐겨찾기