解决button快速点击
private PublishSubject<Boolean> eventSubject = PublishSubject.create();
public static final int TIME_BETWEEN_EVENTS_MILLIS = 500;
public static final int NUMBER_OF_EVENTS = 2;
public DoubleClick() {
eventSubject.buffer(eventSubject.debounce(TIME_BETWEEN_EVENTS_MILLIS, TimeUnit.MILLISECONDS))
.filter(events -> events.size() == NUMBER_OF_EVENTS)
.subscribe(events -> doSomething());
button.setOnClickListener((button) -> eventSubject.onNext(true));
}
通过使用PublishSubject,我们可以发送和捕获点击事件,过滤单位时间间隔内重复发送的点击事件。当然,这种处理方式可以应用在任何事件上。比如,一个搜索输入框要根据用户输入关键字后再执行搜索逻辑,就可以用这种方法在Text Changed事件中避免用户在输入关键字过程中不停地去执行搜索逻辑。
每隔10分钟执行一次API请求
sourceObservable.repeatWhen(completed -> completed.delay(10, TimeUnit.MINUTES));
但是请注意,repeatWhen操作符只有在Observable发送完成onComplete事件后才会重复执行下去,否则请使用retryWhen(retryWhen和repeatWhen操作符区别)
用flatmap操作符组合2种具有依赖关系的类型
比如,我们获取User Order逻辑是:先获取App Token , 再根据App Token去获取User Token,最后根据App Token和User Token去获取User Order
Observable<Order> orderObservable =
getAppTokenObservable()
.flatMap((appToken) -> geUserTokenObservable(appToken),
(appToken,userToken) -> getOrder(appToken,userToken));
分页请求数据
如果分页请求是根据当前页返回的标志来请求下一页,那么rxjava可以很好地帮你处理分页逻辑。具体做法是:根据分页标志,在未遇到分页结束标志时,直接请求下一页数据,并且将结果和上一页数据合并,持续这样操作,一直到遇到分页结束标志。
public Observable<List<User>> getAllUsers() {
//请求一页数据,根据你的API设计,不一定传null
return getUsersObservable(null);
}
private Observable<List<User>> getUsersObservable(final String lastUserId) {
return apiAdapter.getData(lastUserId)
.filter(userList -> !isLastPage(userList))
.flatMap(this::getNextPageUsersObservable);
}
private Observable<List<User>> getNextPageUsersObservable(final List<User> userList) {
Observable<List<User>> usersPageObservable = Observable.just(userList);
int lastUserId = getLastUserId(userList);
Observable<List<User>> nextUsersPageObservable = getUsersObservable(lastUserId);
return Observable.merge(nextUsersPageObservable, usersPageObservable);
}
private boolean isLastPage(final List<User> userList) {
return userList.isEmpty();
}
轻量级别rxbus
public class RxBus {
private static final RxBus instance = new RxBus();
private final Subject<RxEvent> rxBus;
public RxBus() {
PublishSubject<RxEvent> rxEventPublishSubject = PublishSubject.create();
rxBus = rxEventPublishSubject.toSerialized();
}
public static RxBus getInstance() {
return instance;
}
public Observable<RxEvent> getRxBus() {
return rxBus;
}
public void post(final RxEvent rxEvent) {
rxBus.onNext(rxEvent);
}
public class RxEvent {
}
}
SerializedSubject和PublishSubject区别在于,SerializedSubject是线程安全的。