Android实现倒计时两种方式

CountDownTimer倒计时

  • 定义一个倒计时的值和间隔
    private static final long MILLIS_IN_FUTURE = 60000;
    private static final long COUNT_DOWN_INTERVAL = 1000;
  • 定义一个TimeCount类继承CountDownTimer
private class TimeCount extends CountDownTimer {

        TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            if (mTvGetCode != null) {
                mTvGetCode.setClickable(false);
                String second = millisUntilFinished / 1000 + "秒";
                mTvGetCode.setText(second);
            }
        }

        @Override
        public void onFinish() {
            if (mTvGetCode != null) {
                mTvGetCode.setText("获取验证码");
                mTvGetCode.setClickable(true);
            }
        }
    }
  • new TimeCount并在请求接口成功后调用start()
timecount = new TimeCount(MILLIS_IN_FUTURE, COUNT_DOWN_INTERVAL);
timecount.start();
  • 最后结束当前页面时取消TimeCount
timecount.cancel();

RxAndroid 倒计时

  • 定义一个subscriber
private Subscriber<Long> subscriber;
  • 在请求接口成功后开始订阅
private void Test() {
        final int count = 60;
        Observable<Long> ob = Observable.interval(1, TimeUnit.SECONDS)
                .take(count)
                .map(new Func1<Long, Long>() {
                    @Override
                    public Long call(Long aLong) {
                        return count - aLong;
                    }
                }).doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        mTvGetCode.setClickable(false);
                    }
                }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
        subscriber = new Subscriber<Long>() {
            @Override
            public void onNext(Long aLong) {
                if (mTvGetCode != null) {
                    mTvGetCode.setText(aLong + "秒");
                }
            }

            @Override
            public void onCompleted() {
                if (mTvGetCode != null) {
                    mTvGetCode.setText("获取验证码");
                    mTvGetCode.setClickable(true);
                }
            }

            @Override
            public void onError(Throwable e) {
            }
        };
        ob.subscribe(subscriber);
    }
  • 最后结束当前页面时取消订阅
subscriber.unsubscribe();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 6,660评论 2 8
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 4,514评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 46,006评论 8 93
  • “慈云书画院‘’缘起 新野人 九州风雅,乾坤朗朗。诸子百家,竞相鸣...
    归一堂阅读 3,468评论 2 1