`
lovelease
  • 浏览: 382974 次
社区版块
存档分类
最新评论

Android实现可自动关闭的定时器

 
阅读更多
之前一篇文章里有用到过一个封装好的定时器工具类,现在又做了一些升级,支持自定义响应多少次以后自动关闭,这里单独共享出来:
package com.example.util;

import java.util.Timer;
import java.util.TimerTask;

import com.example.CnLog;

import android.os.Handler;
import android.os.Message;

/**
 * Generate a timer object with specified 'delay' and 'period', 
 * you can handle events with 'TimerManager.LOAD_PROGRESS' 
 * and 'TimerManager.CLOSE_PROGRESS', then do your progress.
 * If you want to get 'timerId', just get it from 'arg1'
 * 
 * @author jackie
 *
 */
public class Manager {

	private static final String TAG = TimerManager.class.getSimpleName();
	private Handler mHandler;
	/** Timer **/  
    private Timer timer = null;  
    /** TimerTask **/  
    private TimerTask timerTask = null;
    /** Delay Time in milliseconds **/  
    private int mDelay;
    /** Period in milliseconds **/  
    private int mPeriod;
    /** trigger times **/  
    private int mTimes = -1;
    /** Timer in progressing flag **/  
    public static final int LOAD_PROGRESS = 0;  
    /** Timer close flag **/  
    public static final int CLOSE_PROGRESS = 1;  
    /** TimerId **/  
    private int mTimerId = 0;
    
    /**
     * Construct a unlimited timer
     * 
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     */
    public TimerManager(int delay, int period) {
    	this.mDelay = delay;
    	this.mPeriod = period;
    }
    
    /**
     * Construct a unlimited timer, with specified handler
     * 
     * @param handler your own handler to handle the events from this timer
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     */
    public TimerManager(Handler handler, int delay, int period) {
    	this(delay, period);
    	this.mHandler = handler;
    }
    
    /**
     * Construct a times-limited timer
     * 
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     * @param times auto close timer after how many times, minimum is 1
     */
    public TimerManager(int delay, int period, int times){
    	this(delay, period);
    	if (times < 1) {
    		throw new IllegalArgumentException("times can not smaller than 1");
    	}
    	this.mTimes = times;
    }
    
    /**
     * Construct a times-limited timer, with specified handler
     * 
     * @param handler your own handler to handle the events from this timer
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     * @param times auto close timer after how many times, minimum is 1
     */
    public TimerManager(Handler handler, int delay, int period, int times) {
    	this(handler, delay, period);
    	if (times < 1) {
    		throw new IllegalArgumentException("times can not smaller than 1");
    	}
    	this.mTimes = times;
    }
    
	public void startTimer() {
		CnLog.w(TAG, "==========> Start timer!");
        if (timerTask == null) {
            timerTask = new TimerTask() {
                @Override  
                public void run() {
                    Message msg = new Message();  
                    msg.what = LOAD_PROGRESS;  
                    msg.arg1 = (int) (++mTimerId);
                    if (mHandler != null) {
                    	mHandler.sendMessage(msg);
                    }
                    // Have times-limit, and already reached
                    if (mTimes != -1 && mTimerId == mTimes) {
                    	closeTimer();
                    }
                }  
            };
            timer = new Timer();  
            timer.schedule(timerTask, mDelay, mPeriod);  
        }  
    }
  
    public void closeTimer() {
    	CnLog.w(TAG, "==========> Close timer!");
        if (timer != null) {  
            timer.cancel();  
            timer = null;  
        }  
        if (timerTask != null) {  
            timerTask = null;  
        }  
        mTimerId = 0;
        if (mHandler != null) {
        	mHandler.sendEmptyMessage(CLOSE_PROGRESS);
        }
    }
    
    public void setHandler(Handler handler) {
    	this.mHandler = handler;
    }
}


用法很简单,定义自己的handler以响应定时任务,在合适的地方打开和关闭定时器即可:
private void insTimer() {
		Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case TimerManager.LOAD_PROGRESS:
					int timerId = msg.arg1;
					CnLog.d(TAG, "Timer in processing. timerId: " + timerId);
					if (getCodeTv != null) {
						getCodeTv.setVisibility(View.GONE);
					}
					if (resendLl != null) {
						resendLl.setVisibility(View.VISIBLE);
						int remain = MAX_TIMES - timerId;
						String resendDisp = "(" + remain + ")";
						remainTv.setText(resendDisp);
					}
					break;
				case TimerManager.CLOSE_PROGRESS:
					CnLog.d(TAG, "Timer closed.");
					if (getCodeTv != null) {
						getCodeTv.setVisibility(View.VISIBLE);
					}
					if (resendLl != null) {
						resendLl.setVisibility(View.GONE);
					}
					break;
				}
				super.handleMessage(msg);
			}
			
		};
		timer = new TimerManager(handler, 0, 1000, MAX_TIMES);
	}
// Start timer
timer.startTimer();
// Stop timer
timer.closeTimer();
分享到:
评论

相关推荐

    Android 简单对话框,列表对话框示例

    这个示例演示对话框的用法,包括普通的AlertDialog,列表对话框,进度对话框,自定义对话框 这里实现一个在3秒后自动关闭对话框的功能,通过一个定时器来完成

    2分钟倒计时,可实现页面切换、APP处于后台 或者 APP 关闭 倒计时继续

    2分钟倒计时,可实现页面切换、APP处于后台 或者 APP 关闭 倒计时继续(代码中private static final int TIME_DIFF = 120*1000;//时间间隔 2分钟 被我标成10分钟了 自己改下注释 我就不改了 )

    Android启动页解决方案(推荐)

    启动页几乎成为了每个app的标配,有些商家在启动页中增加了开屏广告以此带来更多的收入。目前启动页的广告都有倒计时的功能,那么我们在倒计时的过程中能做些什么呢?下面通过本文给大家详细介绍供大家参考

    Android开发之AlarmManager的用法详解

    Android中的AlarmManager实质上是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver)。 一、概述: 该类提供一种访问系统闹钟...

    快照相机 SnapCam_HDR_6.0.0_patched

    - 触摸全景图标可创建全景照片(Android 4.0及以上) - 快速拍摄模式可以预览分辨率快速捕获照片 - 在视频录制期间捕获快照 - 使用音量键来缩放和拍摄照片 - 在光线不足的环境下录制视频时自动打开闪光灯 - 可将界面...

    Snap Camera HDR v6.7.0

    - 触摸全景图标可创建全景照片(Android 4.0及以上) - 快速拍摄模式可以预览分辨率快速捕获照片 - 在视频录制期间捕获快照 - 使用音量键来缩放和拍摄照片 - 在光线不足的环境下录制视频时自动打开闪光灯 - 可将界面...

    Snap Camera HDR v6.4.1

    - 触摸全景图标可创建全景照片(Android 4.0及以上) - 快速拍摄模式可以预览分辨率快速捕获照片 - 在视频录制期间捕获快照 - 使用音量键来缩放和拍摄照片 - 在光线不足的环境下录制视频时自动打开闪光灯 - 可将界面...

    Snap Camera HDR_v6.4.3

    - 触摸全景图标可创建全景照片(Android 4.0及以上) - 快速拍摄模式可以预览分辨率快速捕获照片 - 在视频录制期间捕获快照 - 使用音量键来缩放和拍摄照片 - 在光线不足的环境下录制视频时自动打开闪光灯 - 可将界面...

    闹钟one iAlarm v3.0.2

    闹钟ONE会自动记录分析每次闹钟响起时,您延迟了多少次才关闭闹钟。当记录的数据足够分析时,闹钟ONE会在您开启闹钟或设定新闹钟时对您的设定提供建议。比如,帮您增大闹钟音量,或是调整闹钟响铃方式。 -通过...

    Dimmer:调光器安卓应用

    调光器 关于 调光器可让您将屏幕亮度降低到 Android 允许的水平以下。 在夜间使用手机时,避免眼睛疲劳非常有帮助。 该应用程序有一个简约的界面,让事情变得甜蜜和简单。...定时器自动关闭服务 关闭通知中的选项

    绿色守护 Greenify Donate 4.7.5 build 47500 中文多语免费版.zip

    设备管理:受限于 Android 系统的机制设计,此权限是唯一可在非 ROOT 设备上实现休眠完成后立即锁屏的必要权限。当需要此权限时,绿色守护将显式的请求您的授权。 在其它应用之上绘制内容:当需要关闭屏幕时,确保...

    popinGen:一个 jquery 插件允许轻松创建具有所有功能的 popin 或图层

    自动关闭定时器 全屏弹出 在 Open 和 Close 事件中添加您自己的 CSS3 效果 多个回调方法以获得最佳控制 为关闭事件绑定 ESC 键 和更多... 在 IE7+、Chrome、Firefox、Safari、IOS、Android 上测试 Popin 或 Layer.....

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    智能鱼缸控制系统-电路方案

    一个简单的项目,实现灯,过滤和换气的时钟控制,以及通过MQTT的远程覆盖。 硬件组件: ESP8266 ESP-12E × 1 电容1000μF× 1 OpenBuilds线缆 - 脚× 1 LM317 DC-DC线性转换器模块× 1 电阻10k欧姆× 7 电阻221欧姆...

    智能喷水灭火系统,高效更节约-电路方案

    使用本地网络连接,TI的CC1310 Launchpads,Beagle Bone Black和亚马逊网络服务,我们将传达湿度和天气数据,打开和关闭洒水喷头。该系统将在地下运行,并且能够在几乎没有物理维护的情况下保持运行。在外面运行的...

Global site tag (gtag.js) - Google Analytics