1. 计时器

两个核心类 Timer 和 TimerTask

 

1) Timer核心方法

 

//Schedules the specified task for execution after the specified delay.void schedule(TimerTask task, long delay)//Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.void schedule(TimerTask task, long delay, long period)

 

 

第一个方法只执行一次;

第二个方式每隔period执行一次,delay表示每次执行的延时时间,其实主要表现在第一次的延时效果,比如delay设置为0,那么立马执行task内容,如果设置为1000,那么第一次执行task会有一秒的延时效果。

 

2) TimerTask用于继承(或者直接定义并初始化匿名类),并重写run方法,定义自己的业务逻辑。

 

3) 手动结束定时器,

Timer和TimerTask都有cancel方法,而且最好同时调用

如果已经cancel,下次必须创建新的Timer才能schedule

 

4) 如果你在当前的activity中schedule了一个task,但是没有等到task结束,就按Back键finish了当前的activity,Timer和TimerTask并不会自动cancel或者销毁,它还会在后台运行,此时如果你在task的某个阶段要调起一个控件(比如AlertDialog),而该控制依赖被销毁的activity,那么将会引发crash。

 

5) 例如对进度条实现每一秒递增的效果(主要代码)

//总时长private static final long TOTAL_QUERY_MINUTES = 50;//比如每5秒去查询数据库private static final long QUERY_INTERVAL = 5 *1000;private static final int TIMER_SCHEDULE_CODE = 1;int timePassed=0;QueryTimerTask queryTask;private Timer timer;//显示定时器的效果ProgressBar statusBar;private Handler mHandler= new Handler(new Handler.Callback() {    @Override    public boolean handleMessage(Message msg) {        switch (msg.what) {                        case TIMER_SCHEDULE_CODE:                statusBar.setProgress(timePassed);                //Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);                if (timePassed>=TOTAL_QUERY_MINUTES){                    if (timer != null)                        timer.cancel();                    if (queryTask != null)                        queryTask.cancel();                    new AlertDialog.Builder(YourActivity.this).                            setTitle("超时通知").setMessage("已超时,是否继续等待?")                        .setPositiveButton("继续等待", new DialogInterface.OnClickListener() {                            public void onClick(DialogInterface dialog, int which) {                                reSchedule();                            }                        })                        .setNegativeButton("取消任务", new DialogInterface.OnClickListener() {                            public void onClick(DialogInterface dialog, int which) {                                //cancelTask();                            }                        }).show();                                break;                        //....        }        return true;    }});void reSchedule() {    timePassed = 0;    if (timer != null) {        timer.cancel();    }    if (queryTask != null) {        queryTask.cancel();    }    timer = new Timer();    queryTask = new QueryTimerTask();    //每一秒执行一次,第一次有延时一秒的效果    timer.schedule(queryTask, 1000, 1000);}//自定义taskclass QueryTimerTask extends TimerTask {    @Override    public void run() {    //比如每过QUERY_INTERVAL去查询信息        if ((timePassed * 1000) % QUERY_INTERVAL == 0) {            //query();        }        timePassed++;        //通知handler去改变statusBar        Message message = mHandler.obtainMessage();        message.what = TIMER_SCHEDULE_CODE;        mHandler.sendMessage(message);    }}

 

 2. 倒计时

其实也可以用上面的方法实现,

安卓额外提供了CountdownTimer类

 

//由于以1秒间隔不准,所以取其一半来做间隔int countTemp = 2;//此处写的是500的间隔,实际通过countTemp达到1秒间隔的效果countDownTimer = new CountDownTimer(5000, 500) {        @Override        public void onTick(long millisUntilFinished) {            if (countTemp == 2) {                //可以看出来其实millis并不是非常标准的                Log.w(TAG, String.format("%d秒", millisUntilFinished));                Log.w(TAG, String.format("%d秒", Math.round(millisUntilFinished / 1000.0)));                getCodeBtn.setText(String.format("%d秒", Math.round(millisUntilFinished / 1000.0)));                countTemp--;            } else {                countTemp++;            }        }        @Override        public void onFinish() {            getCodeBtn.setText("获取验证码");            isCountDown = true;            countTemp = 2;        }    };}//开始倒计时countDownTimer.start();

 

这个类实际使用还是有点麻烦的,详见

Android: CountDownTimer skips last onTick

Android CountDownTimer shows 1 for two seconds

CountDownTimer skipping one second when displaying on TextView

 

 

更多相关文章

  1. android图片切换ImageSwichter的动画切换效果
  2. Android(安卓)root权限判断
  3. Android(安卓)的AsyncTask使用
  4. Android(安卓)Java代码执行adb Shell命令
  5. android 关于再按一次退出程序效果
  6. android中用socket 接收服务器的消息
  7. Android(安卓)SqlLiter使用
  8. Android(安卓)ANR 分析
  9. 分享一个Android左右侧滑的效果实现 sliding layout

随机推荐

  1. Android使edittext弹出的软键盘位于输入
  2. 手动编译源码,打造自己的增量更新。
  3. 去掉WebView中的白色背景
  4. Android中点击按钮后隐藏输入法
  5. 删除Android(安卓)Studio中的工作空间(pro
  6. Android添加ButterKnife时报错Error:(2,
  7. 编译android源码
  8. Android事件总线 浅谈 EventBus
  9. 2018 Android(安卓)框架汇总(转)
  10. Android:如何显示网络图片