您的位置:首页 > 移动开发 > Android开发

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%亲测可以

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息