RxJava2. x 초보 자

19616 단어 프레임
첫째, RxJava 를 처음 알 았 다.
(1), RxJava 가 무엇 입 니까?
RxJava 는 ReactiveX 입 니 다.http://reactivex.io/) JVM 에서 의 구현, ReactiveX 는 Observable 시퀀스 를 사용 하여 비동기 와 이벤트 기반 프로그램 을 조합 합 니 다.RxJava 는 ReactiveX 의 연장 이 고 RxJava 는 경량급 이 며 RxJava 는 Observable 의 추상 적 이 고 이와 관련 된 고급 함수 에 만 관심 을 가진다.통속 적 으로 RxJava 는 프로 그래 밍 모델 로 일치 하 는 프로 그래 밍 인 터 페 이 스 를 제공 하여 비동기 데이터 흐름 을 처리 하 는 데 도움 을 준다.RxJava 는 함수 의 응답 방식 으로 구현 된다.
(2), RxJava 를 왜 사용 합 니까?
겉으로 볼 때 RxJava 는 코드 를 간결 하 게 작성 하고 간결 함 에 주의 하 는 것 이 간단 하지 않 습 니 다.코드 양 이 반드시 줄 어 들 수 있 는 것 은 아니 지만 구조 가 뚜렷 해서 읽 기 에 편리 하 다.사실 가장 근본 적 인 것 은 RxJava 가 데이터 흐름 이나 사건 을 유연 하 게 처리 하고 효율 적 인 처리 스 레 드 생 성과 병행 을 할 수 있다 는 것 이다.
둘째, RxJava 를 어떻게 사용 합 니까?
(1) AndroidStudio 를 사용 하려 면 gradle 에 추가 해 야 합 니 다.
    //RxJava    
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    //RxAndroid    
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

(2) 여 기 는 RxJava2. x 버 전 으로 어떻게 사용 하 는 지 소개 하고 독자 에 게 RxJava1. x 버 전 을 먼저 보 는 것 을 권장 합 니 다. 그러면 버 전의 차 이 를 비교 하여 RxJava 를 잘 이해 하 는 데 도움 이 됩 니 다.(3) 장면 을 사용 할 때 보통 안 드 로 이 드 개발 과정 에서 백 스테이지 스 레 드 에서 일부 임 무 를 처리 해 야 한다.예 를 들 어 AsyncTask, ContentProvider, Services, 네트워크 요청 등 이다.AsyncTask 를 사용 하면 메모리 가 새 고 ContentProvider 와 Services 설정 이 번 거 롭 습 니 다.RxJava 는 우리 가 이 문제 들 을 해결 하 는 데 도움 을 줄 수 있다.
3. RxJava 관찰자 모드
(1) 개념: 안 드 로 이 드 개발 에서 우리 가 자주 사용 하 는 클릭 사건 은 바로 관찰자 모델 이다.View 는 피 관찰자 이 고 OnClickListener 는 관찰자 이다. 이들 은 setOnClickListener 를 통 해 바 인 딩 관 계 를 구축한다. (여기 서 간단하게 소개 한다. Android 의 더 많은 개발 모델 을 알 고 싶다 면 책 인 을 추천 한다.)
(2), Observable (피 관찰자) / Flowable (피 관찰자 RxJava2. x 버 전 추가), Observer (관찰자) / Subscriber (관찰자), Subscribe (구독 자).관찰자 와 피 관찰자 가 구독 을 통 해 귀속 관 계 를 맺 는 다.
(3), RxJava2. X 에서 Observable 은 Observer 구독 에 사 용 됩 니 다. 백 프 레 셔 는 지원 되 지 않 으 며, Flowable 은 Subscriber 구독 에 사 용 됩 니 다. 백 프 레 셔 (Backpressure) 를 지원 합 니 다.배 압 이란 피 관찰자 가 데이터 나 사건 을 보 내 는 속도 가 관찰자 의 처리 속도 보다 훨씬 빠 른 상황 에서 상류 피 관찰자 에 게 발송 속 도 를 낮 추 라 고 알려 주 는 전략 을 말한다.배 압 에 대한 개념 추천http://blog.csdn.net/jdsjlzx/article/details/52717636
연산 자
(1), create () 는 Create 연산 자 를 사용 하여 처음부터 Observable / Flowable 을 만 듭 니 다. 이 연산 자 는 관찰 자 를 매개 변수 로 하 는 함 수 를 전달 합 니 다.
   //      
   Observable observable = Observable.create(new ObservableOnSubscribe() {

            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                e.onNext("Hello Word");
                e.onComplete();
            }
        });
   //          
   Observer observer = new Observer() {
            //  RxJava2.x      ,           , Disposable       
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "onSubscribe");

            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                Log.e(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete");
            }
        };
    //         
    observable.subscribe(observer);

이 코드 는 Observable 구현 방식 이 며, 인쇄 결 과 는 onSubscribe - > Hello Word - > onComplete 입 니 다.여기 서 알 수 있 듯 이 onSubscribe 는 onNext 전에 호출 됩 니 다. 여 기 는 onSubscribe 방법 에서 초기 화 된 작업 을 할 수 있 습 니 다.
     Flowable flowable = Flowable.create(new FlowableOnSubscribe(){

            @Override
            public void subscribe(FlowableEmitter e) throws Exception {
                e.onNext("Hello Word");
                e.onComplete();
            }
        }, BackpressureStrategy.BUFFER);//    ,        
     Subscriber subscriber = new Subscriber() {

            @Override
            public void onSubscribe(Subscription s) {
                Log.e(TAG, "onSubscribe");
                s.request(1);//request(n)                
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                Log.e(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete");
            }
        };
    flowable.subscribe(subscriber);
  • 이상 코드 는 Flowable 구현 방식 으로 인쇄 되 었 습 니 다. 결 과 는 onSubscribe - > Hello Word - > onComplete 입 니 다.초기 화 작업 이 있 으 면 request (n) 전에 실행 해 야 합 니 다.Flowable 은 백 프 레 셔 를 지원 합 니 다. 쉽게 말 하면 상류 피 관찰자 가 하류 관찰자 의 데이터 요청 에 응 하고 하류 관찰 자 는 request (n) 를 통 해 상류 피 관찰자 에 게 얼마나 많은 요청 을 보 내 는 지 알려 줍 니 다.이렇게 하면 피 관찰자 가 데이터 나 사건 을 보 내 는 속 도 를 피하 고 관찰자 가 데이터 나 사건 을 처리 하 는 속도 보다 훨씬 빨 라 서 대량의 데이터 나 사건 이 쌓 인 다.
  • 피 관찰자 Observable Emitter / FlowableEmitter 는 송신기 라 는 뜻 으로 onNext (), onError (), onComplete () 를 발사 할 수 있다.피 관찰 자 는 여러 개의 onNext () 를 보 낼 수 있 고 관찰자 도 여러 개의 onNext () 를 받 을 수 있다.피 관찰자 가 onComplete () / onError () 를 보 낸 후에 사건 은 계속 보 내 고 관찰 자 는 onComplete () 를 받 은 후에 사건 을 계속 받 지 않 습 니 다.피 관찰 자 는 onComplete () / onError () 를 보 내지 않 아 도 됩 니 다. 둘 은 유일 하고 서로 배척 해 야 합 니 다.
  • 관찰자 Disposable 은 버 려 진 다 는 뜻 으로 관찰자 가 사건 을 받 지 못 하고 피 관찰자 에 게 영향 을 주지 않 는 다
  • .
    (2), just () 는 하나 이상 의 대상 을 이 대상 을 발사 하 는 Observable / Flowable 로 변환 합 니 다.
        Observable.just("Hello World", "Very Good").subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) throws Exception {
                    Log.e(TAG, s);
                }
            });
        Flowable.just("Hello World", "Very Good")
                    .subscribe(new Consumer<String>() {
                        @Override
                        public void accept(String s) {
                            Log.e(TAG, s);
                        }
                    });

    여기 에는 관찰자 가 onNext () 사건 에 만 관심 을 가지 고 다른 사건 은 상관 하지 않 는 다 는 뜻 의 Consumer 가 있 습 니 다. 따라서 이렇게 쓸 수 있 습 니 다 (3). range () 는 지 정 된 범위 의 정수 서열 을 발사 하 는 Observable / Flowable 을 만 들 고 범위 의 시작 과 길 이 를 지정 할 수 있 습 니 다.두 개의 인 자 를 받 아들 이 고 하 나 는 범위 의 시작 값 이 며 하 나 는 범위 의 데이터 의 수량 입 니 다.
         Observable.range(3, 4).subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.e(TAG, integer + "");
                }
            });
            //  3,4,5,6
         Flowable.range(2,4).subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.e(TAG, integer + "");
                }
            });
            //  2,3,4,5

    (4), flatMap () 은 데 이 터 를 발사 하 는 Observable 을 여러 개의 Observables 로 변환 한 후 발사 하 는 데 이 터 를 합 쳐 하나의 Observable 에 넣는다.flatMap () 을 어떻게 사용 하 는 지, 예 를 들 어 우 리 는 상품 분류, 주요 상품 (Goods) 과 하위 상품 (Category) 을 만들어 야 합 니 다.
     new Thread(new Runnable() {
                @Override
                public void run() {
                    //        
                    List list=//   ,    ,  :          ,   ,   
                    for(//   , :  ){
                        Log.e(TAG,"     ");
                        for(//   , :   ){
                                //      UI
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Log.e(TAG,"   ");
                                    }
                                });
                        }
                    }
                }
            }).start();

    이 위조 코드 는 우리 가 자주 사용 하 는 쓰기 입 니 다. 하위 스 레 드 에서 데 이 터 를 얻 고 메 인 스 레 드 에서 UI 를 업데이트 합 니 다. 데이터 가 많 으 면 논리 적 으로 복잡 한 코드 의 가 독성 이 떨 어 집 니 다.flatMap () 을 어떻게 써 야 하 는 지 다시 봅 시다.
     Flowable.fromIterable(goods).flatMap(new Function>() {
                @Override
                public Publisher apply(Goods goods) throws Exception {
                    return Flowable.fromIterable(goods.getList());
                }
    
            })
                    .subscribeOn(Schedulers.io())//     
                    .observeOn(AndroidSchedulers.mainThread())//     
                    .subscribe(new Consumer() {
                        @Override
                        public void accept(Category category) throws Exception {
                            Log.e(TAG, category.getName());
                        }
                    });

    비교 해 보면 이런 방식 의 구조 가 매우 뚜렷 해 졌 다. flatpap () 와 같은 또 하나의 조작 부호 인 contactMap () 은 유일한 차이 점 은 flatpap () 이 무질서 하고 마지막 에 출력 한 것 과 원래 의 서열 이 반드시 같 지 않다 는 것 이다.contactMap () 은 질서 가 있 고 마지막 으로 출력 한 것 은 원래 의 순서 와 같 습 니 다.
    연산 자 에 대해 서 는 여기까지 소개 하 겠 습 니 다. 다른 연산 자 를 알 고 싶다 면 들 어 갈 수 있 습 니 다.http://reactivex.io/살펴보다
    5. 스 레 드 제어 (스케줄 러)
    (1) 안 드 로 이 드 개발 에 도 가장 유용 한 곳 이다.우 리 는 항상 프로그램 에서 시간 이 걸 리 는 조작 을 해 야 한다. 예 를 들 어 네트워크 요청, 파일 조작, 데이터 베이스 작업 등 이다.보통 우 리 는 하위 스 레 드 에서 시간 을 소모 하 는 작업 을 하고 메 인 스 레 드 에서 ui 를 업데이트 합 니 다.(2) Scheduler 는 어떤 유용 한 방법 이 있 습 니까?
  • Schedulers. newThread () 는 항상 새 스 레 드 를 사용 하고 새 스 레 드 에서 작업 을 수행 합 니 다
  • Schedulers. io () 는 io 작업 을 대표 하 는 스 레 드 로 네트워크, 읽 기와 쓰기 파일 등 io 밀집 형 작업 에 사용 된다.new Thread () 와 차이 가 많 지 않 지만 Schedulers. io () 는 내부 에 스 레 드 풀 을 사 용 했 습 니 다. new Thread () 보다 효율 이 높 습 니 다
  • Schedulers. computation () 은 CPU 컴 퓨 팅 밀집 형 작업 을 대표 합 니 다. 예 를 들 어 대량의 계산 이 필요 한 작업
  • Android Schedulers. mainThread () 는 Android 의 메 인 스 레 드
  • 를 대표 합 니 다.
    (3) Observable / Flowable 을 만 들 때 기본 값 은 메 인 스 레 드 에서 이 루어 집 니 다. 다음 코드 는:
     Flowable.just("Hello World", "Very Good")
                    .subscribe(new Consumer<String>() {
                        @Override
                        public void accept(String s) {
                            Log.e(TAG, Thread.currentThread().getName());
                        }
                    });
            //     main

    위의 코드 와 같이 관찰자 든 피 관찰자 든 Scheduler 를 지정 하지 않 으 면 기본 스 레 드 입 니 다.개발 과정 에서 흔히 우 리 는 스 레 드 를 지정 해 야 하 는데 어떻게 바 꿉 니까?
     Flowable<Integer> flowable = Flowable.create(new FlowableOnSubscribe<Integer>() {
                @Override
                public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                    Log.e(TAG, "subscribe   " + Thread.currentThread().getName());
                    e.onNext(1);
                }
            }, BackpressureStrategy.BUFFER);
            Consumer<Integer> consumer = new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.e(TAG, "accept   " + Thread.currentThread().getName());
                }
            };
            flowable.subscribeOn(Schedulers.newThread())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(consumer);
                    //      subscribe   RxNewThreadScheduler-1 
                               accept   main

    이 를 통 해 알 수 있 듯 이 피 관찰자 가 서브 스 레 드 에서 진행 되 고 관찰자 가 메 인 스 레 드 에서 진행 되 는 것 은 주로
    subscribeOn(Schedulers.newThread())
    observeOn(AndroidSchedulers.mainThread())

    subscribeOn () 은 상류 피 관찰자 의 스 레 드 를 지정 하고 observeOn () 은 하류 관찰자 의 스 레 드 를 지정 합 니 다.
    RxJava2. x 에 대해 간단하게 소개 합 니 다. 시간 이 있 으 면 프로젝트 를 만 들 고 시스템 은 이 프레임 워 크 를 사용 합 니 다.본 고 는 완전히 오리지널 이 아니 라 일부 문장 에 자신의 이 해 를 참고 하여 일부 내용 을 간소화 하고 소스 코드 와 관련 되 지 않 아 초보 자 에 게 쉽게 손 에 넣 을 수 있다.

    좋은 웹페이지 즐겨찾기