美文网首页ITBOX程序员RxJava
rxjava在android中的杀手锏瞬间(一)

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

作者: UsherBaby | 来源:发表于2017-04-30 16:53 被阅读1115次

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

    相关文章

      网友评论

      • Xdjm:拉姆大参合进去看不大懂
      • 健康早餐:我想问下,buffer(Observable)这个用法不太理解。这个Observable起了什么作用。
        b09dbea7de6a:@UsherBaby 谢谢,懂了
        UsherBaby:@帅气的昵称啊123 当有点击事件item产生的时候先缓存起来,当一段事件内没有新的事件产生的时候把之前缓存的事件作为一个列表发射出去,当发现有大于等于2的事件时,认为用户在一定时间内连续点了两次。
      • 有兴不虚昧:有没有demo啊,那个分页加载的
        有兴不虚昧:@UsherBaby 看不懂你那个分页请求
        有兴不虚昧:@UsherBaby 我觉得你这个分页请求数据挺优雅的,有没有demo
        UsherBaby:@有兴不虚昧 你具体什么需求,我给你撸出来。

      本文标题:rxjava在android中的杀手锏瞬间(一)

      本文链接:https://www.haomeiwen.com/subject/ywlxtxtx.html