RxJava初识

参考自这个人的博客


添加RxJava的依赖

compile 'io.reactivex:rxjava:1.3.4'

1 基本用法

1.1 创建发送源
Observable<String> sender;

sender = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello World!");
            }
        });
1.2 创建接受者
Observer<String> receiver = new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.i(TAG,"onComplete");
            }

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

            @Override
            public void onNext(String s) {
                Log.i(TAG,"onNext:"+s);
            }
        };
1.3 发送源和接收者相关联
 sender.subscribe(receiver);

执行这段代码后将会看到打印结果

TAG-MainActivity: onNext:Hello World!
1.4 onComplete需要手动调用才会执行
 subscriber.onNext("Hello World!");
 subscriber.onCompleted();

打印结果

 I/TAG-MainActivity: onNext:Hello World!
 I/TAG-MainActivity: onComplete

2 创建发射源的其他方法

2.1 just 发送多个对象
sender = Observable.just("hello1","hello2");

打印结果

I / TAG - MainActivity:onNext:hello1
I / TAG - MainActivity:onNext:hello2
I / TAG - MainActivity:onComplete
2.2 from 发送一个集合
 List<String> list = new ArrayList<>();
 list.add("from1");
 list.add("from2");
 list.add("from3");
 sender  = Observable.from(list);

打印结果

 I/TAG-MainActivity: onNext:from1
 I/TAG-MainActivity: onNext:from2
 I/TAG-MainActivity: onNext:from3
 I/TAG-MainActivity: onComplete
2.3 defer
 sender = Observable.defer(new Func0<Observable<String>>() {
            @Override
            public Observable<String> call() {
                Log.i(TAG, "再发射");
                return Observable.just("deferObserable");
            }
        });
 Log.i(TAG, "先订阅");
 sender.subscribe(receiver);

打印结果

I/TAG-MainActivity: 先订阅
I/TAG-MainActivity: 再发射
I/TAG-MainActivity: onNext:deferObserable
I/TAG-MainActivity: onComplete

可以看到,只有当订阅的时候,才会发送数据。

3 定期执行

3.1 interval

每隔一段时间执行一次onNext();

 Subscriber subscriber = new Subscriber<Long>() {
          @Override
          public void onCompleted() {
              Log.i(TAG, "onComplete");
          }

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

          @Override
          public void onNext(Long aLong) {
              Log.i(TAG, "onNext:" + "aLong = "+aLong);
          }
      };
Observable.interval(1, TimeUnit.SECONDS).subscribe(subscriber);

打印结果

I/TAG-MainActivity: onNext:aLong = 0
I/TAG-MainActivity: onNext:aLong = 1
I/TAG-MainActivity: onNext:aLong = 2
I/TAG-MainActivity: onNext:aLong = 3
I/TAG-MainActivity: onNext:aLong = 4
3.2 range

从20 开始 每次累加1 一直到25

Subscriber subscriber = new Subscriber<Integer>() {
          @Override
          public void onCompleted() {
              Log.i(TAG, "onComplete");
          }

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

          @Override
          public void onNext(Integer integer) {
              Log.i(TAG, "onNext:" + "integer = "+integer);
          }
      };
Observable.range(20,5).subscribe(subscriber);

打印结果

I/TAG-MainActivity: onNext:integer = 20
I/TAG-MainActivity: onNext:integer = 21
I/TAG-MainActivity: onNext:integer = 22
I/TAG-MainActivity: onNext:integer = 23
I/TAG-MainActivity: onNext:integer = 24
3.3 timer
Observable.timer(5, TimeUnit.SECONDS).subscribe(new Subscriber<Long>() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "onComplete");
            }

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

            @Override
            public void onNext(Long aLong) {
                Log.i(TAG, "onNext:" + "aLong = " + aLong);
            }
        });

5秒后打印结果

I/TAG-MainActivity: onNext:aLong = 0
I/TAG-MainActivity: onComplete
3.4 repeat

重复调用onNext() 每次以just里面的内容作为onNext()方法的参数

Observable.just(1,5,6).repeat(3).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "onComplete");
            }

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

            @Override
            public void onNext(Integer str) {
                Log.i(TAG, "onNext:" + "str = " + str);
            }
        });
	I/TAG-MainActivity: onNext:str = 1
    I/TAG-MainActivity: onNext:str = 5
    I/TAG-MainActivity: onNext:str = 6
    I/TAG-MainActivity: onNext:str = 1
    I/TAG-MainActivity: onNext:str = 5
    I/TAG-MainActivity: onNext:str = 6
    I/TAG-MainActivity: onNext:str = 1
    I/TAG-MainActivity: onNext:str = 5
    I/TAG-MainActivity: onNext:str = 6
    I/TAG-MainActivity: onComplete		

4 链式调用

初始化数据

public class User {
    String name;
    User father;

    public User getFather() {
        return father;
    }

    public void setFather(User father) {
        this.father = father;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}
		userList = new ArrayList<>();
        User user1 = new User();
        User father = new User();
        father.setName("李刚");

        user1.setName("小明");
        user1.setFather(father);

        User user2 = new User();
        user2.setName("小红");

        userList.add(user1);
        userList.add(user2);
4.1 调用subcriber.onNext() 使用数据
Observable.create(new Observable.OnSubscribe<List<User>>() {

            @Override
            public void call(Subscriber<? super List<User>> subscriber) {
                subscriber.onNext(userList); //     1计算出的集合
            }
        }).subscribe(new Action1<List<User>>() { // 2使用这个集合
            @Override
            public void call(List<User> users) {
                Log.i(TAG,users.toString());
            }
        });

打印结果

I/TAG-MainActivity: [User{name='小明'}, User{name='小红'}]
4.2 筛选数据
Observable.create(new Observable.OnSubscribe<List<User>>() {
            @Override
            public void call(Subscriber<? super List<User>> subscriber) { //1 计算出一个集合
                subscriber.onNext(userList);
            }
        }).flatMap(new Func1<List<User>, Observable<User>>() {
            @Override
            public Observable<User> call(List<User> users) {
                return Observable.from(users);
            }
        }).filter(new Func1<User, Boolean>() {                          //3 筛选这个集合
            @Override
            public Boolean call(User user) {
                return user.getName().equals("小明");
            }
        }).subscribe(new Action1<User>() {                              //4 拿到筛选结果
            @Override
            public void call(User user) {
                Log.i(TAG,"user = "+user);
            }
        });

打印结果

I/TAG-MainActivity: user = User{name='小明'}
4.3 多次筛选
Observable.create(new Observable.OnSubscribe<List<User>>() {
            @Override
            public void call(Subscriber<? super List<User>> subscriber) {  //1 计算出的集合
                subscriber.onNext(userList);
            }
        }).flatMap(new Func1<List<User>, Observable<User>>() {             //2
            @Override
            public Observable<User> call(List<User> users) {
                return Observable.from(users);
            }
        }).filter(new Func1<User, Boolean>() {                             //3 删选这个集合
            @Override
            public Boolean call(User user) {
                return user.getName().equals("小明");
            }
        }).map(new Func1<User, User>() {                                   //4 根据筛选结果 再次拿到匹配结果
            @Override
            public User call(User user) {
                if (user.getFather().getName().equals("李刚")) {
                    return user.getFather();
                }
                return null;
            }
        }).subscribe(new Action1<User>() {                                 //5 拿到最终结果
            @Override
            public void call(User user) {
                Log.i(TAG, "father = " + user);
            }
        });

打印结果

I/TAG-MainActivity: father = User{name='李刚'}

5 订阅前与订阅后数据接收问题

5.1 AsyncSubject

需要手动调用onComplete,只接收onComplete调用后的前一个数据。如果不调用onComplete,将不接收任何数据

AsyncSubject<String> asyncSubject = AsyncSubject.create();
        asyncSubject.onNext("asyncSubject1");
        asyncSubject.onNext("asyncSubject2");
        asyncSubject.onNext("asyncSubject3");

        asyncSubject.onCompleted();
        asyncSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "onCompleted");
            }

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

            @Override
            public void onNext(String s) {
                Log.i(TAG, "onNext = " + s);
            }
        });

打印结果

I/TAG-MainActivity: onNext = asyncSubject3
I/TAG-MainActivity: onCompleted
5.2 BehaviorSubject

只接收订阅之前的最后一个数据,再接收其他的数据。
// 如果订阅之前没有发布任何数据,则收到一个默认的数据。

 private void bahaviorSubject() {
        BehaviorSubject<String> behaviorSubject = BehaviorSubject.create("default");
        behaviorSubject.onNext("behaviorSubject1");
        behaviorSubject.onNext("behaviorSubject2");

        behaviorSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "onCompleted");
            }

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

            @Override
            public void onNext(String s) {
                Log.i(TAG, "onNext = " + s);
            }
        });

        behaviorSubject.onNext("behaviorSubject3");
        behaviorSubject.onNext("behaviorSubject4");
    }

打印结果

	    I/TAG-MainActivity: onNext = behaviorSubject2
        I/TAG-MainActivity: onNext = behaviorSubject3
        I/TAG-MainActivity: onNext = behaviorSubject4
5.3 PublishSubject

只能接受到发布之后的

 private void publishSubject() {
        PublishSubject publishSubject = PublishSubject.create();
        publishSubject.onNext("publishSubject1");
        publishSubject.onNext("publishSubject2");
        publishSubject.subscribe(new Observer() {
            @Override
            public void onCompleted() {
                Log.i(TAG, "onCompleted");
            }

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

            @Override
            public void onNext(Object o) {
                Log.i(TAG, "onNext" + o.toString());
            }
        });

        publishSubject.onNext("publishSubject3");
        publishSubject.onNext("publishSubject4");
    }

打印结果

		I/TAG-MainActivity: onNextpublishSubject3
        I/TAG-MainActivity: onNextpublishSubject4
5.4 ReplaySubject 只能接受到发布之后的

不论ReplaySubject何时被订阅,Obsver都能接收到数据

private void replaySubject() {

        //创建默认初始容量大小为16的ReplaySubject,当数据条目超过16会重新分配内存空间。
        ReplaySubject<String> replaySubject = ReplaySubject.create();

        //创建指定初始容量为为100的ReplaySubject
        //replaySubject = ReplaySubject.create(100);

        只接收订阅前最后发送的两条数据
        //replaySubject = ReplaySubject.createWithSize(2);

        //replaySubject被订阅的前一秒内发送的数据才能被接收
        //replaySubject = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, Schedulers.computation());
        
        replaySubject.onNext("replaySubject: pre subscribe 1");
        replaySubject.onNext("replaySubject: pre subscribe 2");
        replaySubject.onNext("replaySubject: pre subscribe 3");

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

        replaySubject.onNext("replaySubject: after subscribe 1");
        replaySubject.onNext("replaySubject: after subscribe 2");
    }

打印结果

I/TAG-MainActivity: replaySubject  replaySubject: pre subscribe 1
I/TAG-MainActivity: replaySubject  replaySubject: pre subscribe 2
I/TAG-MainActivity: replaySubject  replaySubject: pre subscribe 3
I/TAG-MainActivity: replaySubject  replaySubject: after subscribe 1
I/TAG-MainActivity: replaySubject  replaySubject: after subscribe 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值