RxJava 常用操作符大全(二)

这里写图片描述

ThrottleFirst巧妙使用

防止View被连续点击,仅发送指定时间段内的第一个信号

RxView.clicks(btThrottleFirst)
.throttleFirst(3, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(mContext, "我是一个在3秒内不会被重复点击的按钮", Toast.LENGTH_SHORT).show();
}
        });

PublishSubject

与普通的Subject不同,在订阅时并不立即触发订阅事件,而是允许我们在任意时刻手动调用onNext(),onError(),onCompleted来触发事件。

可以看到PublishSubject与普通的Subject最大的不同就是其可以先订阅事件,然后在某一时刻手动调用方法来触发事件,那么拿他又能做些什么?

举个例子:当一个界面发生改变,通知另一个界面做出响应,以下是两个Fragment之间通讯的Demo

1、首先在外部定义好公共的PublishSubject对象

PublishSubject<String> publishSubject = PublishSubject.create();
PublishSubjectTopFragment topFragment = new PublishSubjectTopFragment(publishSubject);
PublishSubjectBottomFragment bottom_Fragment = new PublishSubjectBottomFragment(publishSubject);
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fl_top,topFragment, "top")
.replace(R.id.fl_bottom, bottom_Fragment, "bottom")
.commit();
}

2、TopFragment中负责发出信息

@OnClick(R.id.btn_send)
void sendToBottom(){
String result = et_input.getText().toString().trim();
/**
     *在这一时刻手动调用方法来触发事件:
*                                发出信息
*/
publishSubject.onNext(result);
}

3、BottomFragment中接收到通知后,产生响应

/**
 * 这里先订阅事件:
*               接收到通知后,产生响应
*
 */
publishSubject.subscribe(new Action1<String>() {
@Override
public void call(String s) {
tv_result.setText("收到上级的秘密召令:"+s);
}
});

Buffer

buffer(count = 3):

Buffer操作符所要做的事情就是将数据安装规定的大小做一下缓存,然后将缓存的数据作为一个集合发射出去。

buffer(count = 2, skip = 3):

    skip参数用来指定每次发射一个集合需要跳过几个数据,指定的count为2,skip为3,就会每3个数据发射一个包含两个数据的集合,如果count==skip的话,其就会等效于 buffer(count = 3) 了。

Scan

Scan操作符对一个序列的数据应用一个函数,并将这个函数的结果发射出去作为下个数据应用这个函数时候的第一个参数使用,有点类似于递归操作

Observable.just(1,2,3,4,5)
.scan(new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer*integer2;
}
        }).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
tvResult.append(integer+"\n");
}
});

Distinct

Distinct操作符的用处就是用来去重,非常好理解,所有重复的数据都会被过滤掉。

Observable.just(1,2,3,1,1,2,1,4,5)
.distinct()
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
tvResult.append(integer+"");
}
        });

而操作符DistinctUntilChanged则是用来过滤掉连续的重复数据。

Observable.just(1, 2, 3, 3, 3, 1, 2, 3, 3).distinctUntilChanged();

Filter

只会返回满足过滤条件的数据

Observable.just(1,2,3,4,5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer>=3;
}
        }).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
tvResult.append("被筛选过的战斗力大于等于3的大神们是:"+integer);
}
});

Skip、Take

Skip操作符将源Observable发射的数据过滤掉前n项

Take操作符则只取前n项,理解和使用起来都很容易,但是用处很大。另外还有

SkipLast和TakeLast操作符,分别是从后面进行过滤操作

Observable.just("我","不","我","是","大","帅","锅")
.skip(2)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
tvResult.append(s);
}
        });

Publish

什么是Connectable Observable?

就是一种特殊的Observable对象,并不是Subscrib的时候就发射数据,而是只有对其应用connect操作符的时候才开始发射数据,所以可以用来更灵活的控制数据发射的时机。

而Publish操作符就是用来将一个普通的Observable对象转化为一

个Connectable Observable。需要注意的是如果发射数据已经开始

了再进行订阅只能接收以后发射的数据

Connect

Connect操作符就是用来触发Connectable Observable发射数据的。

应用Connect操作符后会返回一个Subscription对象,通过这个Subscription对象,我们可以调用其unsubscribe方法来终止数据的发射。

另外,如果还没有订阅者订阅的时候就应用Connect操作符也是可以使其开始发射数据的。

使用

先使用publish操作符创建一个Connectable Observable:

private ConnectableObservable<Long> publishObserver() {
Observable<Long> obser = Observable.interval(1, TimeUnit.SECONDS);
obser.observeOn(Schedulers.newThread());
    return obser.publish();
}

然后创建两个Action1对象,在不同的时机对其进行订阅:

ConnectableObservable<Long> obs = publishObserver();
Action1 action2 = o -> log("action2:" + o);
Action1 action1 = o -> {
log("action1:" + o);
    if ((long) o == 3) obs.subscribe(action2);
};
obs.subscribe(action1);

mLButton.setText("start");
mLButton.setOnClickListener(e -> mSubscription = obs.connect());
mRButton.setText("stop");
mRButton.setOnClickListener(e -> {
if (mSubscription != null) {
mSubscription.unsubscribe();
}
});

当点击start按钮的时候对这个Connectable Observable 对象应用
connect操作符,让其开始发射数据。

当发射到3的时候将action2给订阅上,这个两个订阅者将同时收到相同的数据。点击stop按钮的时候终止其数据的发射。

RefCount

RefCount操作符就是将一个Connectable Observable 对象再重新转化为一个普通的Observable对象。

说点什么吧

这里写图片描述
这里写图片描述

天啊,不知不觉,就完了啊。我的天,一个月啊,一个月前计划的学习这些东西开始,到现在,居然到头来发现,好像不是很多,又感觉挺满足的了,好气啊。

本身就喜欢去学习一些好玩的东西,所以,平时不是很忙的时候,都喜欢去默默踩一下坑,慢慢再填上去。

这些操作符主要太简单,所以大部分的很多注释和点我都注释写在了代码里面,Demo在这,有兴趣的可以。。。。额,害羞的说一下,有兴趣的可以来逛逛,万一有啥合适的呢,缘分这种东西很难说的~~
https://github.com/GitHuborz/RxJavaOPDemo

月学习计划总结

这一阵子,也是告一小段落了。

一个月前,准备了这个月的学习计划,着手学习新知识,RxJava,Retrofit等等的这些。从刚开始听着就觉得很屌的东西,从开始谷歌搜索资料,再慢慢一点点看下去,记下笔记和编写Demo,感受这
些主流框架开源库的强大和魅力之处,虽然现在做APP的机会不多,但有关这些的新科技还是时不时更新一下,学习多点,还是很棒的。

然后,这周主要是系统的学习了一番Rx 的我觉得实用的,也常有的操作符,学一个,写一个Demo测试跟上,加上自己的理解,基本我觉得这些也就够日常用了吧,至于不够的,还可以自定义操作符呢,是吧。
O(∩_∩)O~

这段是时间的学习,也整理了一大部分笔记,准备整理一下,小更新一下C博客(RXJava(系列),好久都没动了 ~都存在了云笔记,没办法,懒。。

这次主要学习的内容,都有记录下笔记,也都编写对应的Demo,基本就这些了:
1、MvpDemo (一个简单的MVP架构的demo)
2、RetrofitRxJavaDemo (一个使用RxJava + Retrofit 的小demo)

https://github.com/GitHuborz/MvpDemo-RetrofitRxJvaDemo

一个基于 RxJava+Retrofit+Mvp+... 的浏览Gank. 的妹子的学习小Demo
https://github.com/GitHuborz/MeiZi

RxJava 的所有常用操作符详解+使用Demo
https://github.com/GitHuborz/RxJavaOPDemo

害羞(✿◡‿◡)~
这里写图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,819评论 0 10
  • 创建操作 用于创建Observable的操作符Create通过调用观察者的方法从头创建一个ObservableEm...
    rkua阅读 1,746评论 0 1
  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,570评论 8 93
  • RxJava操作符 创建操作 Range Range操作符根据初始值n和数目m发射一系列大于等于n的m个值 Def...
    Carve_Time阅读 7,917评论 2 18
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 2,178评论 2 8