使用rxjava2实现验证码重新发送按钮的倒计时

主要是为了把休眠和倒计时放到子线程中,同时只能在主线程修改button的文字等信息。
代码中resendbtn就是要在上面显示倒计时的按钮,second是倒计时秒数,执行过程在执行子线程中的倒计时之前,先把按钮禁用,然后执行子线程中的循环,子线程中每调用一次e.onnext方法都会执行一次主线程的onNext方法,子线程负责休眠和倒计时,主线程的onNext方法负责修改button。直到子线程中的循环结束,调用e.onComplete方法,到主线程中把按钮设置可用,完成整个过程。其中子线程和主线程一共交互了second+1次,所以设置subscription.request(second+1)。

/**
     * 重新发送按钮倒计时
     * @param second
     */
    private void clockButton(final int second) {
        //用来在执行子线程中的FlowableOnSubscribe的subscribe方法之前执行
        Consumer consumer = new Consumer() {
            @Override
            public void accept(Object o) throws Exception {
                reSendBtn.setClickable(false);
                reSendBtn.setBackgroundResource(R.color.white_smoke);
            }
        };

        //返回主线程执行
        FlowableSubscriber subscriber = new FlowableSubscriber() {
            @Override
            public void onSubscribe(Subscription s) {
                s.request(second+1);//需要接收,1秒一条,还有最后一个onComplete
            }
            @Override
            public void onNext(Integer i) {
                reSendBtn.setText("重新发送("+i+")");
            }
            @Override
            public void onError(Throwable t) {
                Log.e("FlowableSubscriber", "onError: ");
            }

            @Override
            public void onComplete() {
                Log.d("FlowableSubscriber", "onComplete: ");
                reSendBtn.setText("重新发送");
                reSendBtn.setClickable(true);
                reSendBtn.setBackgroundResource(R.color.orangeRed);
            }
        };

        //在子线程中执行
        Flowable flowable = Flowable.create(new FlowableOnSubscribe() {
            @Override
            public void subscribe(FlowableEmitter e) throws Exception {
                int ss = second;//倒计时ss秒
                while (ss>0){
                    e.onNext(ss);
                    ss--;
                    Thread.sleep(1000);
                }
                e.onComplete();
            }
        }, BackpressureStrategy.BUFFER);//BUFFER就是把RxJava中默认的只能存128个事件的缓存池换成一个大的缓存池,支持存很多很多的数据。

        flowable.subscribeOn(Schedulers.io()).doOnSubscribe(consumer)
                .observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);
    }

你可能感兴趣的:(使用rxjava2实现验证码重新发送按钮的倒计时)