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)


相关推荐

  • JAVA 实习面试题大全必看

    JAVA实习面试题大全必看JavaSE88基础语法9Q1:简单说说Java有哪些数据类型答:①分为基本数据类型和引用数据类型。②基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。Q2:floatnumber=3.4;有没有问…

  • YUV 简介及使用

    YUV 简介及使用一、YUV简介YUV:是一种颜色编码方法,常使用在各个视频处理组件中Y’UV,YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠Y表示明亮度(单取此通道即可得灰度图),U和V则是色度、浓度主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0可以根据其采样格式来从码流中还原每个像素点的YUV值,进而通过YUV…

  • 星际密码[通俗易懂]

    星际密码[通俗易懂]题目:https://www.nowcoder.com/pat/2/problem/254

  • 从0到1打造正则表达式执行引擎(一) 正则表达式转NFA

    从0到1打造正则表达式执行引擎(一) 正则表达式转NFA文章目录前置知识有限状态机状态机下的正则表达式串联匹配并连匹配(正则表达式中的**|**)重复匹配(正则表达式中的**?+***)重复0-1次?重复1次以上重复0次以上匹配指定次数特殊符号(正则表达式中的**.\d\s……**)子表达式(正则表达式**()**)练习题代码实现建图匹配下集预告功能完善化DFA引擎正则引擎优化今天是五一假期第一天,这里先给大家拜个晚年,咳咳!!我…

  • 联想拯救者y7000按键功能_联想Y7000P屏幕闪现白色横条

    联想拯救者y7000按键功能_联想Y7000P屏幕闪现白色横条前阶段买了一个拯救者Y7000P,记录一下功能键的使用:1、一些基本的使用就不详细说了Fn+F1-F11(音量亮度调节等等):其中Fn+F4是关闭开启麦克风,Fn+F7是用来设置扩展屏幕的场景Fn+F9进入设置界面Fn+F10关闭开启摄像头Fn+F11关闭开启触摸板开启关闭切换键盘灯:Fn+Space(空格)切换三种工作模式:Fn+Q键开启关闭屏幕上的Y字logo:Fn+L键2、Fn+Q切换的三种模式:(切换时需接通电源)安静模式:

  • python激活码2021_在线激活

    (python激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

发表回复

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

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