版权声明:本文为博主原创文章,未经博主允许不得转载。 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