rxjava 在 android 中的杀手锏瞬间(一)

阅读 4587
收藏 183
2017-04-30
原文链接:www.jianshu.com

解决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是线程安全的。

评论