天天看点

Rxjava总结第二篇

Rxjava的subject

subject既可以是一个observer也可以是一个observeable,它是连接observer和observable的桥梁。因此,subj可以被理解为subject=observable+observer。rxjava提供了四种subject。

1.publishSubject

PublishSubject只会把在订阅发生的时间点之后来自原始observable的数据发给观察者。PublishSubject从一开始就发射数据,因此在创建完成直至第一个观察者订阅他的这个期间内可能会发生数据丢失。

2.BehaviorSubject

当观察者订阅BehaviorSubject时它开始发射原始被观察者最近发射的数据。倘若此时被观察者还没有发射过数据,就会发射一个默认值,然后继续发射被观察者的数据。如果原始的observable发生错误而终止,BehaviorSubject不在发射数据并且向观察者传递一个异常通知。

3.ReplaySubject

不管观察者何时开始订阅都不会错过任何一条发射过的数据。有不同类型的ReplaySubject,他们用于限定replay的范围,例如设定buffer的具体大小,或者设定具体的时间范围。

4.AsyncSubject

当observable完成时,AsyncSubject只会发射来自观察者的最后一条数据。如果原始的观察者发生错误而终止,AsyncSubject不发射数据并且向观察者传递一个异常通知。

rxjava防抖动

比如说,当用户进行网络请求的时候,如果短时间内点击了很多次,如果点击多少次就响应多少次,同时加载好几个重复的页面,这是不合理的。这种时候我们就要用rxjava防抖动来处理这样的情况。

这里给出防抖动的两种实现:

写法一:自定义observable

写法二:自定义observableonsubscribe

static  Class RxUtils{
  static observable<object> clicks (final view view,long seconds){
  final ViewClickObvervableOnSubscribe viewClickObversableOnSubscribe=new ViewClickObverableOnSubscribe():
if(view!=null){
view.setOnClickListener(new View.OnclickListener(){
@Override
public void Onclick(View v){
ObservableEmmitter<Object> emmitter=viewClickObservableOnsubscribe.getEmitter();
if(emmitter!=null&&!emmitter.isDisposed()){
  if(emmitter!=null&&!emmitter.isDisposed()){
emmitter.onNext(1));
}
}
});
}
return Observable
.create(viewClickObservableOnSubscribe)
.throttleFirst(seconds,TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.doOnDispose(new Action(){
@Override
public void run() throws Exception{
if(view!=null){
view.setOnclickListener(null);
}
}
}
};
}
}