2016-9-9

2016-9-9

1.rxjava使用场景

1.计时:
Observable.interval(0, 10, TimeUnit.MILLISECONDS)
                .map(new Func1<Long, Long>() {
                    @Override
                    public Long call(Long aLong) {
                        return 60 - aLong;
                    }
                })
                .skipWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong >= 20;
                    }
                })
                .takeWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong >= 0;
                    }
                })
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        System.out.println("aLong = [" + aLong + "]");
                    }
                });
interval(long interval, TimeUnit unit): 每隔interval时间间隔后发射一次数据
interval(long initialDelay, long period, TimeUnit unit):第一次延迟initialDelay时间发射数据,之后每隔period时间发射数据
skipWhile:返回true时,开始发射数据, 丢弃之前发射的数据
takeWhile:返回false时,停止发射数据,整个订阅完成(onComplete());
2. 多次点击检测
 Observable<Void> observable = RxView.clicks(view).share();
        observable.buffer(observable.debounce(200,TimeUnit.MILLISECONDS))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<Void>>() {
                    @Override
                    public void call(List<Void> voids) {

                    }
                });
buffer():会将observable 发射的item缓存起来,直到它的参数Observable发射一个item时,它会将之前缓存的都作为一个list发射出去
debounce:该item之后的一段时间内没有item发出,则发出该item,丢弃该item之前的数据
Publish:通过Publish操作符可以将一个普通的Observable转换为一个Connectable Observable。Connectable Observable 可以被多次订阅,被多个Subscriber共享Stream。但是和普通的Observable不同,它在被subscribe之后并不开始产生item,而需要在调用connect()之后才会产生item。
Connect:在Publish中已经提到,用来让Connectable Observable开始产生item。
Refcount:除了Connect,我们有另一种方式来让Connectable Observable 产生item,那就是Refcount,refCount会在第一个subscriber订阅之后自动connect,在最后一个subscriber unsubscribe之后自动disconnect。
Share:Share 其实就是publish().refCount();
3. 取数据先检查缓存的场景
final Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        if (memoryCache != null) {
            subscriber.onNext(memoryCache);
        } else {
            subscriber.onCompleted();
        }
    }
});
Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        String cachePref = rxPreferences.getString("cache").get();
        if (!TextUtils.isEmpty(cachePref)) {
            subscriber.onNext(cachePref);
        } else {
            subscriber.onCompleted();
        }
    }
});

Observable<String> network = Observable.just("network");

//主要就是靠concat operator来实现
Observable.concat(memory, disk, network)
.first()
.subscribeOn(Schedulers.newThread())
.subscribe(s -> {
    memoryCache = "memory";
    System.out.println("--------------subscribe: " + s);
});
4. 多个接口并发取完数据
//拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者
private void testMerge() {
    Observable<String> observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
    Observable<String> observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());

    Observable.merge(observable1, observable2)
            .subscribeOn(Schedulers.newThread())
            .subscribe(System.out::println);
}
5. 一个接口的请求依赖另一个API请求返回的数据
 NetworkService.getToken("username", "password")
    .flatMap(s -> NetworkService.getMessage(s))
    .subscribe(s -> {
        System.out.println("message: " + s);
    });
6. 防止连续点击
RxView.clicks(findViewById(R.id.btn_throttle))
    .throttleFirst(1, TimeUnit.SECONDS)
    .subscribe(aVoid -> {
        System.out.println("click");
    });
throttleFirst:该item是之后的一段时间内第一次发生的item,则发出该item,丢弃该时间内发生的其它item
7. 复杂的数据变换
Observable.just("1", "2", "2", "3", "4", "5")
    .map(Integer::parseInt)
    .filter(s -> s > 1)
    .distinct()
    .take(3)
    .reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
    .subscribe(System.out::println);//9
map: 对Observable发射的每一项数据应用一个函数,转换数据
filter: 只把符合条件的数据发出
distinct:去除发射的重复数据
take: 只发射前几个数据
reduce: 对发射的所有数据应用给定的函数, 然后发射一个最终数据
8. 通过Observable的zip操作符把ResponseBody和url组合在一起(如下图)
zip:多个Observable都发射数据后, 把发射的数据组合在一起发射出去, 有一observable发射错误数据, 则不再组合数据,直接发射错误


参考:
http://bbs.jointforce.com/topic/19448
http://blog.csdn.net/lzyzsd/article/details/50120801

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值