android 定时器封装

android 定时器封装好用的定时器封装工具类,谁用谁知道,代码仅供学习参考。importjava.util.HashMap;importjava.util.LinkedList;importjava.util.Map;importjava.util.Queue;importcom.tcl.framework.log.NLog;importandroid.os.Ha

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
好用的定时器封装工具类,谁用谁知道,代码仅供学习参考。

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);


}





}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160037.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 嘉立创pcb工艺_流程图制作

    嘉立创pcb工艺_流程图制作现在做板子基本上是选择嘉立创和捷配,今天看一下嘉立创如何下PCB和STM贴片单,改天再写一下捷配的下单我喜欢用下单助手,比较方便注意需要把自己的板子的PCB文件用压缩软件生成压缩包文件,名字自己取

  • 串口服务器调试助手使用教程,串口服务器如何配置及串口调试6大技巧

    串口服务器调试助手使用教程,串口服务器如何配置及串口调试6大技巧串口服务器如何配置相信很多用户不是很清楚;今天就针对串口服务器如何配置以及串口调试的6大技巧,加以总结阐述:1、如何设置串行服务器的串行端口属性,例如波特率具体参数及数值大小?①点击屏幕上的“设备”单元;②手动打字输入“程序设置”;③再手动选择“程序”,最后手动输入“串行参数”。2、怎样配置串口服务器?首先,必须了解熟悉自身的操作环境与应用配置参数(熟悉每个串行端口的操作模式、熟悉主要参数包括的网…

  • oracle字符串拼接

    一、“||”拼接类似于“+”号二、CONCAT()函数除了“||”,Oracle还支持使用CONCAT()函数进行字符串拼接,但是只支持两个字符:三、多个CONCAT()函数嵌套如果需要拼接多个字符串,可以进行嵌套:…

  • linux安装pycharm专业版_linux下pycharm使用

    linux安装pycharm专业版_linux下pycharm使用文件准备流程下载pycharm的linux版本的软件包,下载地址:http://www.jetbrains.com/pycharm/download/#section=linux解压$tar-xfpycharm-professional-2017.1.4.tar.gz进入解压后的文件夹下的bin目录,执行sudoshpycharm.sh在安装过程中选择激活码激活注

  • FC游戏 《三国志2-霸王的大陆》攻略「建议收藏」

    FC游戏 《三国志2-霸王的大陆》攻略「建议收藏」《三国志2-霸王的大陆》是日本南梦宫公司研发的一款历史战略模拟游戏,于1992年06月10日在红白机平台上发行。在开始游戏选择君主时(一定要在君主未出现前的画面时进行第二步),按住1P的START不要放,按住START同时,连续依次按上,下,左,右,按满3次,听到“乒”一下的声音后再开始游戏,这时再选君主:君主城金钱、兵马、宝等全满。一、武将1)武将出场时间189年-190…

    2022年10月22日
  • java inputstreamreader类详解_inputstreamreader是什么流

    java inputstreamreader类详解_inputstreamreader是什么流java底层从计算机读取的统统都是二进制,所以一开始我们读取的时候都是先简历连接通道,然后将文件数据以字节流的形式读取进入通道。#建立连接Filefile=newFile(“a.txt”);#二进制流的通道。FileInputStreamfileInputStream=newFileInputStream(file);#你想啊,fileInputStr…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号