안 탁 중 Rxjava

47177 단어 오리지널
RxJava 비동기
*RxJava 의 GitHub 홈 페이지 에 있 는 자기 소 개 는'a library for composing asynchronous and event-based programs using observable sequences for the Java VM'(Java VM 에서 관측 가능 한 시퀀스 를 사용 하여 비동기 적 이 고 이벤트 기반 프로그램 을 구성 하 는 라 이브 러 리)이다.이것 이 바로 RxJava 입 니 다.아주 정확하게 요약 되 었 습 니 다.*
RxJava 장점
간결 한 비동기 작업 의 관건 적 인 점 은 프로그램의 간결 성 이다.스케줄 링 과정 이 비교적 복잡 한 상황 에서 비동기 코드 는 쓰기 도 어렵 고 읽 기도 어렵 기 때문이다.안 드 로 이 드 가 만 든 AsyncTask 와 Handler 는 사실 비동기 코드 를 더욱 간결 하 게 하기 위 한 것 이다.RxJava 의 장점 도 간결 하지만 간결 하고 남 다른 점 은 프로그램 논리 가 복잡 해 지면 서 간결 함 을 유지 할 수 있다 는 것 이다.
개념:확 장 된 관찰자 모델
  • RxJava 의 비동기 실현 은 확 장 된 관찰자 모델 을 통 해 이 루어 진다

  • RxJava 는 Observable(관찰 가능 자,즉 피 관찰자),Observer(관찰자),subscribe(구독),사건 등 네 가지 기본 개념 이 있다.Observable 과 Observer 는 subscribe()방법 을 통 해 구독 관 계 를 실현 하여 Observable 은 필요 할 때 이 벤트 를 보 내 Observer 에 알 릴 수 있 습 니 다
  • onComplete():이벤트 대기 열 완료.RxJava 는 모든 사건 을 단독으로 처리 할 뿐만 아니 라,그것들 을 하나의 대열 로 간주한다.RxJava 는 새로운 onNext()가 더 이상 발송 되 지 않 을 때 onComplete()방법 을 표지 로 트리거 해 야 한다 고 규정 하고 있다.onError():이벤트 대기 열 이상.이벤트 처리 과정 에서 이상 이 발생 하면 onError()가 실 행 됩 니 다.동시에 대기 열 이 자동 으로 종료 되 며 더 이상 이벤트 가 발생 할 수 없습니다.올 바 르 게 실행 되 는 이벤트 시퀀스 에서 onComplete()와 onError()는 하나 뿐 이 고 이벤트 시퀀스 의 마지막 입 니 다.주의해 야 할 것 은 onComplete()와 onError()두 사람 도 서로 배척 하 는 것 이다.즉,대기 열 에서 그 중 하 나 를 호출 하면 다른 하 나 를 호출 하지 말 아야 한 다 는 것 이다.Observable 만 들 기
  • Observable 은 피 관찰자 로 서 언제 사건 을 촉발 하고 어떤 사건 을 촉발 할 지 결정 합 니 다.RxJava 는 create()방법 으로 Observable 을 만 들 고 이벤트 트리거 규칙 을 정의 합 니 다.
    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("Hello");
            subscriber.onNext("Hi");
            subscriber.onNext("Aloha");
            subscriber.onCompleted();
        }
    });
    
    

    스 레 드 제어-Scheduler(1)스 레 드 가 지정 되 지 않 은 상황 에서 RxJava 는 스 레 드 가 변 하지 않 는 원칙 을 따른다.즉,어느 스 레 드 에서 subscribe()를 호출 하 는 지,어느 스 레 드 에서 이 벤트 를 생산 하 는 지.어느 라인 에서 생산 되 는 사건,어느 라인 에서 소비 되 는 사건.스 레 드 를 전환 하려 면 스케줄 러(스케줄 러)가 필요 합 니 다.
    3)Subscribe(구독)는 Observable 과 Observer 를 만 든 후 subscribe()방법 으로 연결 하면 전체 체인 이 작 동 할 수 있 습 니 다.1.Subscriber.onStart()를 호출 합 니 다.이 방법 은 앞에서 이미 소개 되 었 으 니 선택 할 수 있 는 준비 방법 이다.2.Observable 의 OnSubscribe.call(Subscriber)을 호출 합 니 다.여기 서 이벤트 발송 의 논리 가 실행 되 기 시작 합 니 다.이 를 통 해 알 수 있 듯 이 RxJava 에서 Observable 은 생 성 할 때 바로 이 벤트 를 보 내 는 것 이 아니 라 구독 되 었 을 때,즉 subscribe()방법 이 실 행 될 때 이다.3.들 어 온 Subscriber 를 Subscription 으로 되 돌려 줍 니 다.이것 은 unsubscribe()를 편리 하 게 하기 위해 서 입 니 다.
    1.Retrofit 와 의 결합
    Retrofit 는 Square 의 유명한 네트워크 요청 라 이브 러 리 입 니 다.Retrofit 를 사용 하지 않 은 것 은 이 소절 을 뛰 어 넘 는 것 을 선택 할 수 있 습 니 다.제 가 든 모든 장면 은 예 일 뿐 입 니 다.그리고 예 간 에 앞 뒤 가 관련 되 지 않 고 벽돌 을 던 져 옥 을 끌 어 올 리 는 역할 일 뿐 입 니 다.그래서 여 기 를 뛰 어 넘 고 다른 장면 을 보 셔 도 됩 니 다.
    Retrofit 는 전통 적 인 Callback 형식의 API 뿐만 아니 라 RxJava 버 전의 Observable 형식의 API 도 제공 합 니 다.다음은 Retrofit 의 RxJava 버 전 API 와 전통 버 전의 차 이 를 비교 적 으로 소개 하 겠 습 니 다.
    2. RxBinding
    RxBinding 은 Jake Wharton 의 오픈 소스 라 이브 러 리 로 Android 플랫폼 에 RxJava 기반 Binding API 를 제공 합 니 다.Binding 이란 OnClickListener 를 설정 하고 TextWatcher 와 같은 등록 바 인 딩 대상 을 설정 하 는 API 다.
    3.각종 비동기 조작
    앞에서 든 Retrofit 와 RxBinding 의 예 는 기 존의 Observable 라 이브 러 리 를 제공 할 수 있 는 두 개의 라 이브 러 리 입 니 다.이 라 이브 러 리 로 Observable 을 자동 으로 생 성 할 수 없 는 비동기 동작 이 있다 면 직접 쓸 수도 있 습 니 다.예 를 들 어 데이터 뱅 크 의 읽 기와 쓰기,큰 그림 의 불 러 오기,파일 압축/압축 해제 등 여러 가지 배경 에 놓 고 작업 해 야 하 는 시간 소모 작업 은 RxJava 로 이 루어 질 수 있 습 니 다.앞의 몇 장의 예 가 있 으 면 더 이상 예 를 들 지 않 아 도 될 것 입 니 다.
    4. RxBus
    RxBus 이름 은 라 이브 러 리 처럼 보이 지만 라 이브 러 리 가 아니 라 모델 입 니 다.RxJava 를 사용 하여 EventBus 를 실현 하 는 것 이 고 Otto 나 GreenRobot 의 EventBus 를 사용 하지 않 아 도 된다 는 생각 입 니 다.
    public class Rxjava {
        public static void main(String[] args) {
           /* new Observable(){
    
                @Override
                protected void subscribeActual(Observer super String> observer) {
    
    
                    observer.onNext("   ");
                    observer.onNext("   ");
                    observer.onComplete();
                }
            }.subscribe(new Observer() {
                @Override
                public void onSubscribe(Disposable d) {
    
    
                }
    
                @Override
                public void onNext(String s) {
    
                    System.out.println("    :" + s);
    
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
                @Override
                public void onComplete() {
                    System.out.println("      ");
    
                }
            });*/
    
    //        mapOpretor();
    //        flatMapOpretor();
    //        groupByOperator();
    //        filterOperator();
    //        distinctOperator();
    //        ignoreElements();
    //        elementAtOperator();
            windowOperator();
        }
    
        //map   
        public static  void mapOpretor(){
            Observable.just("HELLO")
             .map(new Function<String, String>() {
                @Override
                public String apply(String s) throws Exception {
                    return s.toLowerCase();
    
                }
            })
                    .map(new Function<String, String>() {
                        @Override
                        public String apply(String s) throws Exception {
                            return s + ",world";
                        }
                    })
                    .subscribe(new Observer<String>() {
                        @Override
                        public void onSubscribe(Disposable d) {
    
                        }
    
                        @Override
                        public void onNext(String s) {
                            System.out.println("       :" + s);
    
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
    
        }
    
        //flatMap   
        public static void flatMapOpretor() {
    
            User user = new User();
            user.userName = "zhangsan";
            user.addresss = new ArrayList<>();
            User.Address address1 = new User.Address();
    //        User.Address address1 = new User.Address();
            address1.street = "    ";
            address1.city = "  ";
            user.addresss.add(address1);
    
            User.Address address2 = new User.Address();
            address2.street = "    ";
            address2.city = "  ";
            user.addresss.add(address2);
    
            /*Observable.just(user)
                    .map(new Function>() {
                        @Override
                        public List apply(User user) throws Exception {
                            return user.addresss;
                        }
                    }).subscribe(new Consumer>() {
                @Override
                public void accept(List addresses) throws Exception {
                    for (int i = 0; i < addresses.size(); i++) {
                        System.out.println("   :" + addresses.get(i).street);
                    }
                }
            });*/
    
            Observable.just(user)
                    .flatMap(new Function<User, ObservableSource<User.Address>>() {
                        @Override
                        public ObservableSource<User.Address> apply(User user) throws Exception {
                            return Observable.fromIterable(user.addresss);
                        }
                    })
    
                    .subscribe(new Consumer<User.Address>() {
                @Override
                public void accept(User.Address address) throws Exception {
                    System.out.println("   :" + address.street);
    
                }
            });
    
        }
    
        //groupBy   
        public static void groupByOperator(){
            Observable
                    .range(1,8)
                    .groupBy(new Function<Integer, String>() {
                        @Override
                        public String apply(Integer integer) throws Exception {
                            return (integer % 2 == 0)? "   ":"   ";
                        }
                    }).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
                @Override
                public void accept(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) throws Exception {
                    if(stringIntegerGroupedObservable.getKey().equals("   ")){
                        stringIntegerGroupedObservable.subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                System.out.println(stringIntegerGroupedObservable.getKey() + "member:"  + integer);
                            }
                        });
                    }/*else if(stringIntegerGroupedObservable.getKey().equals("   ")){
                        stringIntegerGroupedObservable.subscribe(new Consumer() {
                            @Override
                            public void accept(Integer integer) throws Exception {
                                System.out.println(stringIntegerGroupedObservable.getKey() + "member:"  + integer);
    
                            }
                        });
                    }*/
    
                    System.out.println();
                }
            });
        }
    
        //filter   
        public static void filterOperator(){
    
            Observable.just(1,8,20,3,50,4,6,100)
                    .filter(new Predicate<Integer>() {
                        @Override
                        public boolean test(Integer integer) throws Exception {
                            return integer > 8;
                        }
                    }).subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    System.out.println("next :" + integer);
                }
            });
    
        }
    
        //distinct         
        public static void distinctOperator() {
            Observable.just("A","A","B")
                    .distinct()
                    .subscribe(new Consumer<String>() {
                        @Override
                        public void accept(String integer) throws Exception {
                            System.out.println("next :" + integer);
    
                        }
                    });
        }
    
        //ignoreElements        
        public static void ignoreElements() {
            Observable.just(1,2,3,4,5)
                    .ignoreElements()
                    .subscribe(new Action() {
                        @Override
                        public void run() throws Exception {
                            System.out.println("     ");
    
                        }
                    });
        }
    
    
        //elementAt     n   
        public static void elementAtOperator() {
            Observable.just(1,2,3,4,5,6,7)
                    .elementAt(2)
    //                .elementAt(12,34)
                    .subscribe(new Consumer<Integer>() {
                        @Override
                        public void accept(Integer integer) throws Exception {
                            System.out.println("next:" + integer);
    
                        }
                    });
        }
    
        //window   
        public static void windowOperator() {
            Observable.range(1,10)
                    .window(2)
                    .subscribe(new Consumer<Observable<Integer>>() {
                        @Override
                        public void accept(Observable<Integer> integerObservable) throws Exception {
                            System.out.println("On next:" );
                            integerObservable.subscribe(new Consumer<Integer>() {
                                @Override
                                public void accept(Integer integer) throws Exception {
                                    System.out.println("accept:" + integer );
    
                                }
                            });
    
                        }
                    });
        }
    
    
    }
    
         
    String[] names = ...;
    Observable.from(names)
        .subscribe(new Action1<String>() {
            @Override
            public void call(String name) {
                Log.d(tag, name);
            }
        });
    
      id        
    int drawableRes = ...;
    ImageView imageView = ...;
    Observable.create(new OnSubscribe<Drawable>() {
        @Override
        public void call(Subscriber<? super Drawable> subscriber) {
            Drawable drawable = getTheme().getDrawable(drawableRes));
            subscriber.onNext(drawable);
            subscriber.onCompleted();
        }
    }).subscribe(new Observer<Drawable>() {
        @Override
        public void onNext(Drawable drawable) {
            imageView.setImageDrawable(drawable);
        }
    
        @Override
        public void onCompleted() {
        }
    
        @Override
        public void onError(Throwable e) {
            Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
        }
    });
    
    
    
    
    

    좋은 웹페이지 즐겨찾기