>  기사  >  Java  >  RxJava_03 [관찰자 생성 작업]을 간단하게 자세히 소개합니다.

RxJava_03 [관찰자 생성 작업]을 간단하게 자세히 소개합니다.

黄舟
黄舟원래의
2017-03-04 09:44:261707검색

이 튜토리얼은 RxJava1을 기반으로 합니다. >다음 함수는 모두 Observable을 생성하는 데 사용되는 함수입니다. 필요에 따라 해당 기능을 만들 수 있습니다.
Create - 원래 Observable 생성 기능

    Defer - 구독 생성 후 생성된 Observable
  1. Empty/Never/Throw - 데이터를 보내지 않거나 예외 데이터를 보내는 Observable 생성
  2. Just - 1-9 값을 보내는 Observable 생성
  3. From - 큐를 방출하는 Observable 생성
  4. Interval&Timer - 타이머와 같은 Observable 생성
  5. Range - 생성 Observable
  6. 특정 정수 유형을 전송하는 반복
  7. Create 연산자를 사용하여 처음부터 Observable을 생성하고, 이 연산자에 관찰자를 매개변수로 허용하는 함수를 전달합니다. 그리고 Observable처럼 동작하도록 이 함수를 작성합니다. 관찰자의 onNext, onError 및 onCompleted 메서드를 적절하게 호출합니다.

    잘 구성된 유한 Observable은 관찰자의 onCompleted를 정확히 한 번 호출하거나 onError를 정확히 한 번 호출해야 하며 이후에는 관찰자의 다른 메서드를 호출할 수 없습니다.
  8. create 메소드에 전달된 함수에서 관찰자의 isUnsubscribed 상태를 확인하여 관찰자가 없을 때 Observable이 데이터 방출이나 비용이 많이 드는 작업을 중지할 수 있도록 하는 것이 좋습니다.

    샘플 코드:
  9. Observable.create(new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> observer) {
            try {
                if (!observer.isUnsubscribed()) {
                    for (int i = 1; i < 5; i++) {
                        observer.onNext(i);
                    }
                    observer.onCompleted();
                }
            } catch (Exception e) {
                observer.onError(e);
            }
        }
     } ).subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                System.out.println("Next: " + item);
            }
    
            @Override
            public void onError(Throwable error) {
                System.err.println("Error: " + error.getMessage());
            }
    
            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }
        });
출력:

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

2. Defer

Observable은 관찰자가 구독할 때까지 생성되지 않으며 각 관찰자에 대해 새로운 관찰 가능.

Defer 연산자는 관찰자가 구독할 때까지 기다린 다음 Observable 팩토리 메소드를 사용하여 Observable을 생성합니다. 이는 모든 Observer에 대해 이 작업을 수행하므로 각 구독자는 동일한 Observable을 구독하고 있다고 생각하지만 실제로 각 구독자는 자신만의 별도의 데이터 시퀀스를 얻습니다.

코드는 다음과 같습니다:

Observable<String> defer = Observable.defer(new Func0<Observable<String>>() {
    //当observable被创建的时候顺便调用observable内部的call()方法并在方法中发送消息
    //每subscribe()就会在call()中返回一个新的实例对象
    @Override
    public Observable<String> call() {
        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello Android !");
            }
        });
        return observable;
    }
});
defer.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
    }
});

defer.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
    }
});

3.Empty/Never/Throw

Empty

데이터를 방출하지 않지만 종료되는 Observable을 생성합니다. 일반적으로

Never

데이터를 방출하지 않고 오류로 종료되는 Observable을 생성

Throw

데이터를 방출하지 않고 종료되는 Observable을 생성 오류가 발생했습니다

이 세 연산자에 의해 생성된 Observable의 동작은 매우 특별하고 제한적입니다. 이는 테스트에 유용하며 때로는 다른 Observable과 함께 사용되거나 Observable이 필요한 다른 연산자의 매개변수로 사용됩니다.

RxJava는 이러한 연산자를 공백, 절대 및 오류로 구현합니다. 오류 연산자에는 Observable이 종료되는 Throwable 매개변수가 필요합니다. 이러한 연산자는 기본적으로 특정 스케줄러에서 실행되지 않지만 비어 있고 오류가 있는 경우 Scheduler 매개변수를 전달하면 이 스케줄러에 알림을 보냅니다.

4.그냥

관찰자가 관찰자에게 데이터를 전송하려는 경우 코드는 다음과 같습니다.

Observable
    .create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("hello Android");
        }
    })
    .subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.i(TAG, "call: "+s);
        }
    });

위 코드가 데이터를 전송하려는 경우 먼저 Observable .OnSubscribe 인터페이스를 구현해야 합니다. 대신 just 함수를 사용할 수 있습니다. 샘플 코드는 다음과 같습니다:

Observable
    .just("hello Android")
    .subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.i(TAG, "call: "+s);
        }
    });

출력:

onNext: hello Android
Sequence complete.

단일 데이터를 해당 데이터를 내보내는 Observable로 변환하면 됩니다.

유사한 기능은 다음과 같습니다:

just(T t1);

just(T t1,T t2); 🎜>

그냥(T t1,T t2,T t3);

  • 그냥(T t1,T t2,T t3,T t4) ;

  • 그냥(T t1,T t2,T t3,T t4,T t5);

  • RxJava는 이 연산자를 1~9개의 매개변수를 허용하고 매개변수 목록 순서대로 이러한 데이터를 내보내는 Observable을 반환하는 just 함수로 구현합니다.

  • 5.From
  • 1~9개의 데이터를 보내는 just 함수에 비해 From 함수는 데이터 큐를 보내고 출력 길이에 제한이 없습니다.

  • 학교에서 관심 수업을 열었는데, 학기 초에 몇몇 반 친구들이 수업에 왔습니다. 동급생 클래스의 정의는 다음과 같습니다.

    public static class Student {
    
        public String name;
        public int age;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", age=" + age +
                    &#39;}&#39;;
        }
    }

각 동급생의 정보를 저장하기 위해 컬렉션이 생성됩니다.

rree

다음으로 선생님의 설명입니다. 모두 불러주세요. 여기서는 각 학생의 로그인 상태를 인쇄하여 설명합니다.

private ArrayList initPersons() {
    ArrayList<Student> persons = new ArrayList<>();
    persons.add(new Student("张三", 16));
    persons.add(new Student("李四", 17));
    persons.add(new Student("王二麻子", 18));
    return persons;
}
  1. RxJava는 이를 다음과 같이 변환합니다:

    ArrayList persons = initPersons();
    for (int i = 0; i < persons.size(); i++) {
        //打印每个同学
        Log.i(TAG,persons.get(i).toString());
    }
  2. 6.Interval&Timer
  3. 고정된 간격으로 정수 시퀀스를 내보내는 Observable을 만듭니다.

  4. RxJava는 이 연산자를 간격 방법으로 구현합니다. 시간 간격을 나타내는 매개변수와 시간 단위를 나타내는 매개변수를 허용합니다.
  5. //1.定义被观察者,用来发送一个队列的事件
    Observable<Student> observable = Observable.from(persons);
    
    //2.当开始订阅的时候 接收被观察者发送过来的一系列事件
    observable.subscribe(new Action1<Student>() {
        @Override
        public void call(Student student) {
            Log.i(TAG, "call: "+student.toString());
        }
    });

    출력:

    //3000毫米发送一个请求 该请求包含了一个自增长的整数型变量
    Observable<Long> observable = Observable.interval(3000,         TimeUnit.MILLISECONDS, Schedulers.io());
    
    observable.subscribe(new Action1<Long>() {
        @Override
        public void call(Long i) {
            // such as printf RxIoScheduler-2call: 685
            Log.i(TAG, Thread.currentThread().getName()+"call: "+i);
        }
    });
  6. 위 코드는 특정 시간 간격에 따라 하위 스레드의 데이터를 지속적으로 인쇄합니다. 이 작업은 타이머 작업과 유사하며 타이머 타이머를 교체하는 것으로 생각할 수도 있습니다.

비슷한 기능으로 타이머() 기능이 있습니다.

com.m520it.rxjava I/IT520: RxIoScheduler-2call: 0
com.m520it.rxjava I/IT520: RxIoScheduler-2call: 1
com.m520it.rxjava I/IT520: RxIoScheduler-2call: 2
com.m520it.rxjava I/IT520: RxIoScheduler-2call: 3
...

7.Range

특정 정수 시퀀스를 방출하는 Observable을 생성합니다.

범위 연산자는 범위 내에서 순서가 지정된 정수 시퀀스를 내보냅니다. 범위의 시작과 길이를 지정할 수 있습니다.

比如下面这个班级的所有学生都在一个集合里,现在要打印出来,可以是这样的:

private ArrayList initPersons() {
    ArrayList<Student> persons = new ArrayList<>();
    persons.add(new Student("张三", 16));
    persons.add(new Student("李四", 17));
    persons.add(new Student("王二麻子", 18));
    return persons;
}


final ArrayList students = initPersons();
//这里发射一个起始值0,长度students.size()的索引 用来遍历队列
Observable
        .range(0,students.size())
        .subscribe(new Action1() {
            @Override
            public void call(Integer index) {
                Log.i(TAG, "call: "+students.get(index));
            }
        });

8.Repeat

创建一个发射特定数据重复多次的Observable

Repeat重复地发射数据。某些实现允许你重复的发射某个数据序列,还有一些允许你限制重复的次数。

//设置重复发送3次
Observable<String> observable = Observable.just("Hello Android").repeat(3);

Action1<String> action1 = new Action1<String>() {

    @Override
    public void call(String s) {
        Log.i(TAG, "call: " + s);
    }
};
observable.subscribe(action1);

 以上就是深入浅出RxJava_03[被观察者创建操作]的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.