Android-RxJava 공통 API 사용 및 스레드 변환 요점

39233 단어 rxjavaAndroidRxRxJava
RxJava란?RxJava의 GitHub에서의 자기소개는'a library for composing asynchronous and event-based programs using observable sequences for the Java VM'(Java VM에서 관측 가능한 시퀀스를 사용하여 비동기적이고 이벤트 기반 프로그램을 구성하는 라이브러리)이다.이것이 바로 RxJava입니다.
이제 더 이상 할 말이 없으니 바로 오늘의 주제로 들어가자
하나.API 사용
RxJava의 API 사용, Observable 생성, 변환, 데이터 필터 등
1.observable 만들기
Observable의 생성에는 몇 가지 방식이 있는데, 예를 들어create,just,from,interval,timer
1.1 create 방법은 Rxjava에서 Observable을 만드는 가장 기본적인 방법입니다. 예는 다음과 같습니다. Observable을 만들 때 onSubsribe를 매개 변수로 전송하여 Observable 대상에 저장하고 Observable가 구독될 때 call 방법을 터치합니다.
private void testRxMethod_create() {
        Observable observable = Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber super RxBeanInfo> subscriber) {
                RxBeanInfo info = new RxBeanInfo();
                info.setName("lqm.test");
                subscriber.onNext(info);
                subscriber.onCompleted();
            }});
        Subscriber subscriber = new Subscriber()
        {
            @Override
            public void onCompleted() {
                Log.i("rxjava", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
                Log.i("rxjava", "error");
            }
            @Override
            public void onNext(RxBeanInfo o) {
                Log.i("rxjava", o.getName());
            }};
        //    subscribe              ,    ,Observable    call().
        observable.subscribe(subscriber);
    }
11-17 14:27:14.513 14944-14944/pa.test.com.testapp I/rxjava: lqm.test
11-17 14:27:14.513 14944-14944/pa.test.com.testapp I/rxjava: onCompleted

1.2.just -just 방법을 호출하여 보내고 싶은 데이터 원본을 전송하고 구독자가 구독을 할 때 데이터를 출력합니다. 주의해야 할 것은just () 방법은 최대 10개의 파라미터를 전송할 수 있으며, 전송된 파라미터의 순서에 따라 전송할 수 있습니다
private void testRxMethod_just() {
        Observable observable = Observable.just("1", "2", "3","4", "5","6","7","8","9","10");
        Subscriber subscriber = new Subscriber()
        {
            @Override
            public void onCompleted() {
                Log.i("rxjava", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
                Log.i("rxjava", "error");
            }
            @Override
            public void onNext(String o) {
                Log.i("rxjava", o);
            }};
        observable.subscribe(subscriber);
   }

1.3.from - 이 방법의 매개 변수는 하나의 그룹입니다. 그리고from은 그것을 하나의 대상으로 나누어 발사합니다
private void testRxMethod_from() {
        List items = new ArrayList<>();
        items.add("1");
        items.add("2");
        items.add("3");
        Observable observable = Observable.from(items);
        Subscriber subscriber = new Subscriber()
        {
            @Override
            public void onCompleted() {
                Log.i("rxjava", "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
                Log.i("rxjava", "error");
            }
            @Override
            public void onNext(String o) {
                Log.i("rxjava", o);
            }};
        observable.subscribe(subscriber);
    }
11-17 14:44:13.043 30921-30921/pa.test.com.testapp I/rxjava: 1
11-17 14:44:13.043 30921-30921/pa.test.com.testapp I/rxjava: 2
11-17 14:44:13.043 30921-30921/pa.test.com.testapp I/rxjava: 3
11-17 14:44:13.043 30921-30921/pa.test.com.testapp I/rxjava: onCompleted

1.4.interval-타이머, 이 방법은 일정 시간마다 메시지를 발사합니다. interval() 함수의 두 가지 인자: 하나는 두 번 발사하는 시간 간격을 지정하고, 다른 하나는 사용하는 시간 단위입니다.
private void testRxMethod_interval() {
        Observable.interval(2, TimeUnit.SECONDS)
                .subscribe(new Observer() {

                    @Override
                    public void onCompleted() {
                        Log.i("rxjava", "onCompleted");
                    }

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

                    @Override
                    public void onNext(Long number) {
                        Log.i("rxjava", "onNext"+number);
                    }
                });
    }

1.5.timer - 시간 지연기 효과에 도달할 수 있습니다. 구독 후 Observable에서 0을 발사하면 끝납니다. onCompleted ()를 호출합니다.
private void testRxMethod_timer() {
         Observable.timer(3,TimeUnit.SECONDS)
                 .subscribe(new Observer() {

                     @Override
                     public void onCompleted() {
                         Log.i("rxjava", "onCompleted");
                     }

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

                     @Override
                     public void onNext(Long number) {
                         Log.i("rxjava", "onNext"+number);
                     }
                 });
     }

2. Observable 변환 및 필터
2.1.맵 - 객체에 대한 직접 변환 함수로서 Fun 함수를 인삼으로 받아들인 다음 Observable에서 발사된 모든 값에 적용합니다. 입력한 데이터를 처리한 후 새로운 형식의 데이터를 되돌려줍니다.응용 장면은 그림 경로(String)를 처리한 후 비트맵 그림을 되돌려주거나 원시 데이터를 계산하여 처리한 후 필요한 데이터가 될 수 있다.
private void testRxMethod_map() {
        Observable.just(6)
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer/3+"";
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.d("lqm","call:"+s);
                    }
                });
    }

2.2.flatMap—Observable.flatMap()은 Observable의 출력을 입력으로 받고 다른 Observable을 출력합니다.
private void testRxMethod_flatMap() {
        Observable.just("girl;boy;man")
                .flatMap(new Func1>() {
                    @Override
                    public Observable call(String s) {
                        return Observable.from(s.split(";"));
                    }
                })
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        Log.d("lqm", "onNext:" + s);
                    }
                }, new Action1() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.d("lqm", "onerror");
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.d("lqm", "onComplete");
                    }
                });
    }
11-17 15:41:04.743 18653-18653/pa.test.com.testapp D/lqm: onNext:girl
11-17 15:41:04.743 18653-18653/pa.test.com.testapp D/lqm: onNext:boy
11-17 15:41:04.743 18653-18653/pa.test.com.testapp D/lqm: onNext:man
11-17 15:41:04.743 18653-18653/pa.test.com.testapp D/lqm: onComplete

flatMap과 맵을 비교해 보면 flatMap이 전달하는 매개 변수는 Observable이고 되돌아오는 것도 Observable이다. 비록 둘 다 하나의 대상을 전달하고 새로운 대상으로 전환했지만 이 점은 매우 다르다. flatMap의 원리에 대해 여기서 던지는 물선의 한 단락을 인용하여 설명한다. flatMap()의 원리는 다음과 같다. 1.들어오는 이벤트 대상을 사용하여 Observable 대상을 만듭니다.2. 이 Observable을 보내지 않고 활성화시켜 이벤트를 보내기 시작합니다.3. 생성된 Observable에서 보내는 모든 이벤트는 같은 Observable에 송금됩니다. 이 Observable는 이 이벤트를 Subscriber에 통일적으로 전달하는 리셋 방법을 책임집니다.
2.3 Filter - 필터링 방법, 이 방법을 사용하여 우리가 필요로 하지 않는 데이터를 필터링하고false를 되돌려줍니다. 이것은 대상이 요구에 부합되지 않아 필터링된다는 것을 의미합니다.true로 돌아가면 대상이 정상적으로 아래로 내려갈 수 있고 표준에 부합된다는 것을 의미한다.
private void testRxMethod_filter() {
        String[] strArr = {"a123","b123","c123","d123"};
        Observable.from(strArr)
                .filter(new Func1() {
                    @Override
                    public Boolean call(String s) {
                        return s.contains("a") || s.contains("b") || s.contains("c");
                    }
                })
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        Log.d("lqm","call:"+s);
                    }
                });
    }
11-17 20:39:54.761 32378-32378/pa.test.com.testapp D/lqm: call:a123
11-17 20:39:54.761 32378-32378/pa.test.com.testapp D/lqm: call:b123
11-17 20:39:54.761 32378-32378/pa.test.com.testapp D/lqm: call:c123

2.4 distinct - 한 시퀀스에서 중복 제거
private void testRxMethod_distinct() {
        Observable.just("Jack", "Honey","Lucy","Lucy","Jane")
                .distinct().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.i("lqm","onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.i("lqm","onNext" + s);
            }
        });
    }
11-17 20:47:00.141 19536-19536/pa.test.com.testapp I/lqm: onNextJack
11-17 20:47:00.141 19536-19536/pa.test.com.testapp I/lqm: onNextHoney
11-17 20:47:00.141 19536-19536/pa.test.com.testapp I/lqm: onNextLucy
11-17 20:47:00.141 19536-19536/pa.test.com.testapp I/lqm: onNextJane
11-17 20:47:00.141 19536-19536/pa.test.com.testapp I/lqm: onCompleted

여기서 주의해야 할 것은distinct는 기본 유형의 중복과 같은 대상인지 아닌지만 구별할 수 있을 뿐, 서로 다른 대상의 내용이 같으면 무거운 것을 제거할 수 없다는 것이다.
 private void testRxMethod_distinct() {
        RxBeanInfo info1 = new RxBeanInfo();
        info1.setName("jack");
        RxBeanInfo info2 = new RxBeanInfo();
        info2.setName("jack");
        RxBeanInfo info3 = new RxBeanInfo();
        info3.setName("jack");

        Observable.just(info1,info2,info3)
                .distinct().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.i("lqm","onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(RxBeanInfo s) {
                Log.i("lqm","onNext" + s.getName());
            }
        });
    }
11-17 20:50:01.101 25465-25465/pa.test.com.testapp I/lqm: onNextjack
11-17 20:50:01.101 25465-25465/pa.test.com.testapp I/lqm: onNextjack
11-17 20:50:01.101 25465-25465/pa.test.com.testapp I/lqm: onNextjack
11-17 20:50:01.101 25465-25465/pa.test.com.testapp I/lqm: onCompleted

이러한 API는 비교적 자주 사용되는데, 현재는 이것들을 이야기하고 있으며, 흥미가 있으면 안드로이드 개발자의 RxJava에 자세히 설명해 줄 수 있다.
둘.스레드 변환 요점
여기서 주로 RxJava의 Schedulers(스케줄러) 기능을 소개합니다.
모든 Observable에 대해 두 개의 다른 라인으로 정의할 수 있습니다.1. Observable을 사용합니다.observeOn () 은 Observable에서 최근에 보낸 items (Subscriber의 onNext, onCompleted, onError 방법은 observeOn이 지정한 라인에서 실행됩니다) 를 감청하고 검사할 수 있는 라인에 정의할 수 있습니다.2. Observable을 사용합니다.subscribeOn () 은 라인을 정의합니다. subscribeOn () 은subscribe () 가 발생하는 라인, 즉 Observable를 지정합니다.OnSubscribe가 활성화되었을 때의 스레드입니다.
RxJava는 기본적으로 단일 라인입니다. observeOn ()과subscribeOn () 방법을 이용하여 응용 프로그램에 다중 라인 작업을 가져와야 합니다.RxJava는 몇 개의 기존 Schedulers를 추가하여 Observables에 사용합니다. 예를 들어 Schedulers.IO(), Schedulers.컴퓨팅 작업(), Schedulers.새 Thread () (작업을 위한 새 스레드), 그리고 안드로이드에는 전용 안드로이드 Schedulers가 있습니다.mainThread (), 지정한 동작이 안드로이드 메인 라인에서 실행됩니다.
이런 것들을 알게 되면 실제 Rxjava가 온라인 거리에서 어떻게 작동하는지 살펴보자. 여기는case로 나누어 상세하게 설명할 것이다.observeOn만 설정되어 있지만 서로 다른 위치에서 어떤 영향을 미칠까요?
    private void observableEvent() {
        Log.d("lqm","mainthread :"+android.os.Process.myTid());
        Observable.just(1)
                .map(new Func1() {
                    @Override
                    public String call(Integer integer) {
                        Log.d("lqm","map:"+android.os.Process.myTid());
                        return integer+"a";
                    }
                })
                .filter(new Func1() {
                    @Override
                    public Boolean call(String s) {
                        Log.d("lqm","filter:"+android.os.Process.myTid());
                        return s.contains("1");
                    }
                })
                .observeOn(Schedulers.io())
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        Log.d("lqm","call:"+android.os.Process.myTid());
                    }
                });
    }
11-17 21:08:58.551 7624-7624/pa.test.com.testapp D/lqm: mainthread :7624
11-17 21:08:58.591 7624-7624/pa.test.com.testapp D/lqm: map:7624
11-17 21:08:58.591 7624-7624/pa.test.com.testapp D/lqm: filter:7624
11-17 21:08:58.591 7624-8857/pa.test.com.testapp D/lqm: call:8857

위에서 실행한 결과를 보면 메인 라인 id는 7624이고 맵()과 Filter()는 메인 라인에서 실행되며subscribe()를 호출할 때observe On(Schedulers.io())을 사용하기 때문에call() 방법은io 라인에서 실행됩니다.
만약 우리가 observe On () 을 앞당긴다면, 라인에 영향을 미치지 않을까요?
private void observableEvent() {
        Log.d("lqm","mainthread :"+android.os.Process.myTid());
        Observable.just(1)
                .observeOn(Schedulers.io())
                .map(new Func1() {
                    @Override
                    public String call(Integer integer) {                                  Log.d("lqm","map:"+android.os.Process.myTid());
                        return integer+"a";
                    }
                })
                .filter(new Func1() {
                    @Override
                    public Boolean call(String s) {                    Log.d("lqm","filter:"+android.os.Process.myTid());
                        return s.contains("1");
                    }
                })
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {                      Log.d("lqm","onNext:"+android.os.Process.myTid());
                    }
                });
    }
11-18 10:02:35.691 21563-21563/pa.test.com.testapp D/lqm: mainthread :21563
11-18 10:02:35.711 21563-22093/pa.test.com.testapp D/lqm: map:22093
11-18 10:02:35.711 21563-22093/pa.test.com.testapp D/lqm: filter:22093
11-18 10:02:35.711 21563-22093/pa.test.com.testapp D/lqm: onNext:22093

보이시나요? 현재 맵(), Filter(), onNext()가 IO 라인에서 실행되고 있기 때문에 현재로서는 observeOn()이 Subscriber 작업 외에 맵, Filter 등에도 영향을 미치지만 ObserveOn() 작업 후 동작에만 영향을 미칩니다.
계속해서 테스트를 해보겠습니다.

좋은 웹페이지 즐겨찾기