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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,259评论 1 23
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,612评论 25 708
  • 昨天孩子自己与朋友到市里逛街买衣服。孩子看眼花了,与妈妈商量。我不在这买了,我回家去买。想买点好吃的。电话里,温柔...
    山东笑笑爸阅读 181评论 0 1
  • 高三开始,同学们陆续从集体宿舍搬了出来,或独居或两三个同居,我跟小马哥和唐兄一起在学校南边的大路边上合租了...
    路重坡阅读 326评论 0 1