Android倒计时项目中的应用
2017-03-14 17:13
453 查看
今天拿到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%亲测可以
相关文章推荐
- Android进阶——Android常见项目模块之倒计时、定时和延时的应用
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个开源应用项目 【转】
- Android开发者必须深入学习的10个应用开源项目
- Android小项目之--应用解析 Content Provider->内容提供商(附源码)
- Android应用开发实战-移动终端团购网项目开发(送源代码)
- 10个经典的Android开源应用项目
- Android开发者应该深入学习的10个开源应用项目
- 【转】Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者应该深入学习的10个开源应用项目[转]
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者必须深入学习的10个应用开源项目
- Android开发者应该深入学习的10个开源应用项目
- Android开发者必须深入学习的10个应用开源项目