好用的定时器封装工具类,谁用谁知道,代码仅供学习参考。

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;

import com.tcl.framework.log.NLog;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;

public class IoTimer {

public static final int INVALID_TIMER_ID = -1;
private static final int BASE_MSG_ID = 100;
private static volatile IoTimer sTimer = null;
private static final Object slock = new Object();
private TimerHandler mTimerHandler;
private Handler mIoHandler;
private int mBaseTimerId = 1;
private Map<Integer, TimerTask> mTimersList;
private Queue<Integer> mValidIdList = null;
private Looper mIoLooper = null;
private volatile boolean mInited = false;

public static IoTimer shareTimer()
{
if (sTimer == null) {
synchronized (slock) {
if (sTimer == null) {
sTimer = new IoTimer();
sTimer.init();
}
}
}

return sTimer;
}

public static void destroyTimer()
{
if (sTimer != null) {
synchronized (slock) {
final IoTimer timer = sTimer;
if (timer != null) 
timer.destroy();
sTimer = null;
}
}
}

private class TimerTask
{
Runnable action;
int id;
int loopCount;
long expiredTimeout;

void loop()
{
if (loopCount == 0 || loopCount == 1) {
remove(id);
}
else if (loopCount > 1)
loopCount --;

Message msg = mTimerHandler.obtainMessage(messageIdFromTimerId(id), this);
mTimerHandler.sendMessageDelayed(msg, expiredTimeout);
}

void disable()
{
loopCount = 0;
action = null;
mTimerHandler.removeMessages(messageIdFromTimerId(id));
}
}

private IoTimer() {
mTimersList = new HashMap<Integer, IoTimer.TimerTask>();
mValidIdList = new LinkedList<Integer>();
}

private void init() {
if (mInited)
return;

HandlerThread thread = new HandlerThread("io_timer") {

@Override
protected void onLooperPrepared() {

mIoLooper = getLooper();
mTimerHandler = new TimerHandler(mIoLooper);
mIoHandler = new Handler(mIoLooper);

mInited = true;
synchronized (IoTimer.this) {
IoTimer.this.notify();
}
}
};
thread.start();
waitToPrepared();
}

private void waitToPrepared() {
synchronized (this) {
while (!mInited) {
try {
wait(10);
} catch (InterruptedException e) {
break;
}
}
}
}

private void destroy() {
if (!mInited)
return;

clear();
mInited = false;
mIoLooper.quit();
}

public boolean resetTimer(int tid, long timeout)
{
TimerTask task = null;
synchronized (this) {
task = mTimersList.get(tid);
}

if (task == null)
return false;

int mid = messageIdFromTimerId(tid);
mTimerHandler.removeMessages(mid);
task.expiredTimeout = timeout;
Message msg = mTimerHandler.obtainMessage(mid, task);
mTimerHandler.sendMessageDelayed(msg, task.expiredTimeout);
return true;
}

public boolean resetTimer(int tid)
{
if (!mInited)
throw new IllegalStateException("not inited");

TimerTask task = null;
synchronized (this) {
task = mTimersList.get(tid);
}

if (task == null)
return false;

int mid = messageIdFromTimerId(tid);
mTimerHandler.removeMessages(mid);
Message msg = mTimerHandler.obtainMessage(mid, task);
mTimerHandler.sendMessageDelayed(msg, task.expiredTimeout);
return true;
}

public int scheduleTimer(long timeout, Runnable action)
{
return scheduleTimer(timeout, action, 1, timeout);
}

public int scheduleTimer(long timeout, Runnable action, int loop, long delay) {
if (timeout < 0 || action == null || loop == 0)
throw new IllegalArgumentException("timeout is invalid, or action is null, or loop is 0!");

if (!mInited)
throw new IllegalStateException("not inited");

int id = nextTimerId();
if (id == -1) {
return INVALID_TIMER_ID;
}

TimerTask tt = new TimerTask();
tt.id = id;
tt.expiredTimeout = timeout;
tt.action = action;
tt.loopCount = loop;

synchronized (this) {
mTimersList.put(id, tt);
}
Message msg = mTimerHandler.obtainMessage(messageIdFromTimerId(id), tt);
mTimerHandler.sendMessageDelayed(msg, delay);
return id;
}

private synchronized TimerTask remove(int tid)
{
TimerTask ret = null;
ret = mTimersList.remove(tid);
if (!mValidIdList.contains(tid)) {
if (!mValidIdList.offer(tid)){
NLog.e("TimerTask", "offer fail");
}
}

return ret;
}

private synchronized boolean hasTimer(int tid)
{
return mTimersList.containsKey(tid);
}

public void cancelTimer(int tid)
{
TimerTask task = remove(tid);
if (task == null)
return;

task.disable();
}

public synchronized void clear()
{
mValidIdList.clear();
mTimersList.clear();
mBaseTimerId = 1;
}

protected synchronized int nextTimerId() {
if (mValidIdList.size() == 0)
return mBaseTimerId++;
int id = mValidIdList.poll();
return id;
}

private int messageIdFromTimerId(int id)
{
return (BASE_MSG_ID + id);
}

protected void onTimer(TimerTask task) {
final Runnable action = task.action;
if (action != null) { 
action.run();
}
}

class TimerHandler extends Handler
{

public TimerHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
if (msg.what < BASE_MSG_ID)
return;

TimerTask task = (TimerTask) msg.obj;
if (hasTimer(task.id)) {
mIoHandler.post(new TimerRunnable(task));
task.loop();
}
}
}

private class TimerRunnable implements Runnable
{
final TimerTask task;
public TimerRunnable(final TimerTask tt) {
this.task = tt;
}

@Override
public void run() {
onTimer(task);
}

}
}

android 定时器封装相关推荐

  1. Android开发之实现每隔一段时间触发定时器android定时器

    老套路看图: 每隔20秒重新触发 实际上实现也很简单我们可以通过android原生自带的定时器完成,说下思路: 1.首先实现android定时器开启触发 2.在定时器结束的方法中再次触发开启定时器即可 ...

  2. STM32用一个定时器封装多个定时函数调用

    STM32用一个定时器封装多个定时函数调用 用一个定时器开一个1ms的中断: 头文件宏定义如下: #define BASIC_TIM TIM6 #define BASIC_TIM_APBxClock_ ...

  3. android 定时换图片,Android 定时器实现图片的变换

    Android 定时器实现图片的变换 在Android中,要让每秒进行一次ui更新,就需要利用到定时器和handler,message的结合,如果不使用handler就不能达到更新ui的效果,我的理解 ...

  4. android实现10ms定时器,Android定时器不低于〜120ms分辨率

    我一直试图通过TCP Socket连接将我的Android手机传感器数据发送到我的PC.我的目标是刷新10-40毫秒,我正在研究手机传感器在测量技术方面的潜在应用,这些测量技术包括将手机放在秋千上,并 ...

  5. Android 定时器+倒计时 仿淘宝秒杀

    目录结构 效果图: imageViewHolder public class imageViewHolder extends RecyclerView.ViewHolder {public Image ...

  6. Android定时器Timer和TimerTas的使用

    1. 概述 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. Time ...

  7. Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器

    Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器实例的示例: public class AudioPlayer implements MediaPlayer.OnPre ...

  8. android定时器取消,Android定时器崩溃取消

    我有一个定时器运行,然后熄灭,并做了一些事情,定时器启动罚款.Android定时器崩溃取消 然后我想要做的是点击一个按钮,然后创建一个电子邮件.除了在计时器运行时单击该按钮之外,一切正常,应用程序崩溃 ...

  9. android studio 定时器,Android定时器和Handler用法实例分析

    本文实例讲述了Android定时器和Handler用法.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Android Studio 二.定时器使用示例: 初始化: //定 ...

最新文章

  1. NTU 课程 ERIC(5) 对社会的责任
  2. 基于特征的对抗迁移学习论文_lt;EYD与机器学习gt;迁移学习:PTL选择式对抗网络...
  3. jQuery的三种bind/One/Live/On事件绑定使用方法
  4. 这些道理,未必正确,一定准确
  5. php全选删除,php+ajax简单实现全选删除的方法
  6. Oracle的order by的中文排序问题
  7. 【Kettle】血统分析
  8. Sql Server 学习2
  9. 创维酷开电视能换成android系统吗,创维酷开电视怎么系统升级【图文教程】
  10. 移动硬盘需要格式化才能打开如何解决?
  11. 最全iOS马甲包审核以及常见审核问题
  12. linux用 弹出光驱 cdromeject_sw,Linux_Linux系统下光驱软开关与限速,一、光驱的软开关:eject -r cdro - phpStudy...
  13. C++进阶——STL源码之红黑树(_Rb_tree)
  14. 来华30年,甲骨文继续聚数创新!
  15. 【Redis实现系列】集群MOVED错误与ASK错误
  16. 纯js计算字符串中的字符的个数(汉字算两个字符计算)
  17. 天池大赛-心跳信号分类预测:赛题理解与baseline解析
  18. 高仿富途牛牛-组件化(三)-界面美化
  19. Linux rz 上传文件失败
  20. ma5822是什么设备_MA5822 配置二层交换

热门文章

  1. 天云数据中标某股份制证券公司项目 提供国产企业级人工智能平台服务
  2. android 环形时间显示_Android自定义波浪加载圆形进度条——(自定义控件 一)...
  3. Android 判断点是否在Path中(含不规则形状的Path)
  4. UIpath for each遍历文件,判断,删除文件。catch捕捉全局异常
  5. vue3.0 + elementPlus 后台管理系统模板
  6. ffmpeg 解码本地裸视频流
  7. 某30m小箱梁渠桥结构计算与施工图设计
  8. Excel中countif函数统计“不等于”的条件
  9. 指纹识别与交互(冯建江,2022)
  10. ####Python 3 Keras YOLO v3解析与实现