Android倒计时项目中的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15895655/article/details/62045966

这里写图片描述

今天拿到UI图,看到很多产品模块中涉及到倒计时,本想偷偷懒在网上copy一份源码,在览阅中发现并不适合多个模块管理,最后决定亲自撸起。


UI图
这里写图片描述


源码中主要分为两个类

  • CountdownManager类
    * 倒计时管理器,所有需要倒计时的页面,都需要添加监听接口,避免每个模块单独起线程,浪费时间。 在退出模块时 必须调用unRegisterCountDownTimer方法,否则会造成内存泄露。*
private ArrayList<CountDownTimer> timers = new ArrayList<>();

    private static CountdownManager ourInstance = new CountdownManager();

    public static CountdownManager getInstance() {
        return ourInstance;
    }

    private CountdownManager() {

    }

    public void registerCountDownTimer(CountDownTimer countDownTimer) {
        if (countDownTimer.remainTime > 0) {
            timers.add(countDownTimer);
        }

        if (timers.size() == 1) {
            new Thread(this).start();
        }

    }

    public void unRegisterCountDownTimer(CountDownTimer countDownTimer) {
        if (countDownTimer.remainTime>1)
            countDownTimer.remainTime=1;

    }

    @Override
    public void run() {
        while (timers.size() > 0) {
            handler.sendEmptyMessage(0);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    ArrayList<CountDownTimer> completeTimes = new ArrayList<>();
    Handler handler;

    {
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {


                super.handleMessage(msg);
                synchronized (this) {

                    for (CountDownTimer timer : timers) {
                        timer.remainTime--;

                        int second = (int) (timer.remainTime % 60);
                        int minute = (int) (timer.remainTime / 60 % 60);
                        int hour = (int) (timer.remainTime / 60 / 60);
                        timer.onTimeChange(hour, minute, second, timer.remainTime);
                        if (timer.remainTime <= 0) {
                            completeTimes.add(timer);
                        }

                    }
                    timers.removeAll(completeTimes);
                    completeTimes.clear();
                }

            }
        };
    }
主要操作和管理都放在这个类中

  • CountDownTimer接口
    作用:配合管理类时间变化进行回调
    public long remainTime;
    public TextView tv_hour,tv_minute,tv_second,textView;

    public abstract void onTimeChange(int hour, int minute, int second, long remainTime);

}
remainTime:设置的倒计时时间,第二列变量分别表示:时,分,秒,扩展的(view),第二列并不是必须使用,因项目而定

  • 如何快速迁移到项目中:
  • 复制以上两个类到项目中
  • 注册监听,设置倒计时时间(秒)
  @OnClick(R.id.btn)
    public void onClicktime() {
        timer = new Timer();
        timer.remainTime = 3700;
        time_tv.setEnabled(false);
        CountdownManager.getInstance().registerCountDownTimer(timer);
        Log.v("registerCountDownTimer ", timer + "注册时间");
    }
  • 实现CountDownTimer接口,回调中处理时间倒计时显示
class Timer extends CountDownTimer {
        @Override
        public void onTimeChange(int hour, int minute, int second, long remainTime) {
            if (remainTime <= 0) {

                time_tv.setText("重新发送验证码");
                time_tv.setEnabled(true);
                if (timer != null) {
                      CountdownManager.getInstance().unRegisterCountDownTimer(timer);
                    timer = null;
                }
                Log.v("registerCountDownTimer ", hour + "===时1" + minute + "===分" + second + "====秒" + timer);
            } else {
                Log.v("registerCountDownTimer ", hour + "===时" + minute + "===分" + second + "====秒" + timer);
                time_tv.setText("倒计时(h:m:s)格式:" + hour + ":" + minute + ":" + second + "   ,S(格式):" + remainTime);
            }
        }
    }
  • 重要一点:退出进行销毁
 @Override
    public void finish() {
        if (timer != null) {
            Log.v("registerCountDownTimer", timer + "销毁时间");
            CountdownManager.getInstance().unRegisterCountDownTimer(timer);
            timer = null;
        }
        super.finish();
    }

想get更多优质源码,关注专属开发者公众号:开发者源码。
所有的源码都在这里~

这里写图片描述


源码下载地址:http://download.csdn.net/detail/qq_15895655/9780708

解压密码:0912 ,100%亲测可以

猜你喜欢

转载自blog.csdn.net/qq_15895655/article/details/62045966