本文主要是介绍CountDownTimer使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CountDownTimer类介绍
CountDownTimer类比较简单,总共就一个构造和4个方法。内部是通过handler实现
CountDownTimer(long time,long interval):参数time是总时间,interval是间隔时间
start():开始倒计时的方法
cancel():取消倒计时的方法
onTink(long time):抽象方法,每个间隔时间一到就会调用一次,需要自己实现。参数time是指剩下的时间
onFinish():抽象方法,倒计时完成的方法
CountDownTimer示例
效果图
主要代码MainActivity.java
public class MainActivity extends Activity {private TextView textView;private MyCountDownTimer timer;private final long TIME = 5 * 1000L;private final long INTERVAL = 1000L;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.tv);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startTimer();}});}private class MyCountDownTimer extends CountDownTimer{public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long l) {long time = l / 1000;textView.setEnabled(false);textView.setText(time+"秒");}@Overridepublic void onFinish() {textView.setEnabled(true);textView.setText("重新发送");cancelTimer();}}/*** 开始倒计时*/private void startTimer() {if (timer == null) {timer = new MyCountDownTimer(TIME, INTERVAL);}timer.start();}/*** 取消倒计时*/private void cancelTimer() {if (timer != null) {timer.cancel();timer = null;}}@Overrideprotected void onDestroy() {super.onDestroy();cancelTimer();}}
存在的问题
CountDownTimer如果使用不当,常常会报空指针异常,甚至造成严重的内存泄漏
CountDownTimer的内部实现是采用Handler机制,通过sendMessageDelayed延迟发送一条message到主线程的looper中,然后在自身中收到之后判断剩余时间,并发出相关回调,然后再次发出message的方式
这样的方式其实是有一定弊端的,那就是如果在Activity或者Fragment被回收时并未调用CountDownTimer的cancel()方法结束自己,这个时候CountDownTimer的Handler方法中如果判断到当前的时间未走完,那么会继续调用
sendMessageDelayed(obtainMessage(MSG), delay);
触发
onTick(millisLeft);
当回调了Activity或者fragment中CountDownTimer的onTick方法时,Activity或者Fragment已经被系统回收,从而里面的变量被设置为Null,再调用
textView.setText(time+”秒”);
textView为空,也就空指针了
同时,CountDownTimer中的Handler方法还在继续执行,这一块空间始终无法被系统回收也就造成了内存泄漏问题
总结
1、在CountDownTimer的onTick方法中记得判空
activity中if(MainActivity.this.isFinishing()){//doing something...}fragment中if(getActivity()!=null){//doing something...}
2、在配合DialogFragment使用时,如果在onFinish()方法调用了 dismiss()方法让弹框消失,记得 判断getFragmentManager是否为空
@Overridepublic void onFinish() {if(getFragmentManager()!=null){dismiss();}}
3、在使用CountDownTimer时,在宿主Activity或fragment生命周期结束的时候,记得调用timer.cancle()方法
@Overridepublic void onDestroy() {if(timer!=null){timer.cancel();timer = null;}super.onDestroy();}
源码下载
限于篇幅,只放了MainActivity的代码
布局是一个TextView,背景和文字通过设置selector来实现可点和不可点的效果
戳以下链接下载源码
http://download.csdn.net/download/u010356768/10243971
这篇关于CountDownTimer使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!