Android实现定时器的五种方法实例详解

发布时间 - 2026-01-10 23:18:06    点击率:

一、Timer

Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用。

跟handler自身实现的定时器相比,Timer可以做一些复杂的处理,例如,需要对有大量对象的list进行排序,在TimerTask中执行不会阻塞子线程,常常与handler结合使用,在处理完复杂耗时的操作后,通过handler来更新UI界面。

timer.schedule(task, delay,period);

task: TimerTask类型的对象,实现TimerTask的run()方法就是要周期执行的一个任务;

delay : 从定时器初始化成功 开始启动 的延迟时间。

period:定时器的间隔时间。

第三个参数就是执行的周期,为long类型。

TimerTask task= new TimerTask() {
   @Override
   public void run() {
    count++;
    Log.i("MainActivity",count + "");
   }
};
new Timer().shedule(task,0,1000);//

以下是几种调度task的方法:

//time为Date类型:在指定时间执行
timer.schedule(task, time);
//firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。
timer.schedule(task, firstTime,period);
//delay 为long类型:从现在起过delay毫秒执行一次。
timer.schedule(task, delay);
//delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
timer.schedule(task, delay,period);
//time为Date类型:在指定时间执行一次。
timer.schedule(task, time);
//firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。
timer.schedule(task, firstTime,period);
//delay 为long类型:从现在起过delay毫秒执行一次。
timer.schedule(task, delay);
//delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
timer.schedule(task, delay,period);

注意: 1.taskonDestory()中取消掉,否则可能发生崩溃

2.用TimerTask定时进行某些操作的APP,即使退出了,TimerTask中依然会运行一会,但是不能长时间运行

3.对于部分手机,如果你在TimerTask直接更新了UI线程是不会报错的,而且运行正常,但是一定注意,更新UI一定要在主线程中执行,否则排查错误的时候你懂得。而且这个东西特别耗电,特别耗电,特别耗电,重要的事情说三遍,一定在不使用的时候关闭

二 、CountDownTimer

CountDownTimer cdt = new CountDownTimer(10000, 100) {
 @Override
 public void onTick(long millisUntilFinished) {
  tv_hello.setText(millisUntilFinished + "");
 }
 @Override
 public void onFinish() {
 }
};
cdt.start();

onTick中的方法一次

直到执行完10000/100次为止,最后会执行onFinish()

三、 AlarmManager

 Intent intent2 = newIntent(ReadLogService.this,TestBroadcast.class);
 PendingIntent pd=PendingIntent.getBroadcast(getApplicationContext(),0,intent2,PendingIntent.FLAG_ONE_SHOT);
 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
 long triggerTime =SystemClock.elapsedRealtime() + 5*1000;
 am.set(AlarmManager.ELAPSED_REALTIME,triggerTime, pd);

上面就是定时器的基本用法,先获取manager,然后定义闹钟的flag,循环时间,到指定时间发出的pendingIntent。

一般都发出的pendingIntent都是广播,我们自定义一个广播接收器,就可以通过接收这个广播,来处理自己的功能逻辑了。

这里需要注意在独立进程中配置,这是android所定义的

<receiver android:name="com.xxxx.Receiver" android:process=":remote" />

1,Alarm定时不需要程序自身去维护,而又系统来维护,使得程序更好避免了容易出错问题,更是占用系统资源,cpu占有率。

2,即使程序退出后,程序自身不会有任何烦恼的问题,系统到时间自动调用对应组件执行定义好的逻辑

3,定时的多样性,包括一次定时,循环定时(在xx年x月x日执行,周一至周五执行,每天几点几分执行。。。)

四、 handler

Handler可以帮助我们在子线程中操作UI线程,例如子线程解析数据,解析结束后通知UI刷新界面。他本身也可以实现定时器。

private Handler handler = Handler() {
  public handleMessage(android.os.Message msg) {
   switch (msg.what) {
    :
    // 移除所有的msg.what为0等消息,保证只有一个循环消息队列再跑
    handler.removeMessages();
    // app的功能逻辑处理
    ...
    // 再次发出msg,循环更新
    handler.sendEmptyMessageDelayed(, );
    break;
    :
    // 直接移除,定时器停止
    handler.removeMessages();
    break;
   default:
    break;
   }
  };
 };

只要在启动定时器的时候,Handler.sendEmptyMessage(0),定时器就启动了。继续循环和停止的方法,注释上已经写了。

每次循环都是在主线程中操作,避免了子线程和主线程之间的穿插交互,个人觉得比timer好控制,功能实现也很简单。

个人觉得比较适用连续更新UI,不做复杂耗时的处理的情况,例如在播放器中,我们需要更新当前播放进度的时间的显示,仅仅是更新了文字显示,用handler就是个不错的选择。

五、Thread

Thread实现定时器是创建一个子线程,在里面while循环,可以通过handler来更新UI。个人觉得Thread和Timer没区别,只是长得不一样。

private MyThread thread;
private class MyThread extends Thread {
 public boolean stop;
 public () {
  while (!stop) {
   // 处理功能
   // 通过睡眠线程来设置定时时间
    {
    Thread.sleep();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 };
};
/**
 * 启动线程
 * */
private start() {
  (thread == ) {
  thread = MyThread();
  thread.start();
 }
}
/**
 * 停止线程
 * */
private () {
  (thread != ) {
  thread.stop = ;
  thread = ;
 }
}

觉得跟Timer差不多,没什么特殊优点

跟Timer差不多,多线程如果考虑不周经常会出问题,经常会出现多个相同功能的线程同时存在,android本身对于子线程的使用使用数量是有限制的,而且一个app同时跑多个线程是一个很可怕的事情,所以和Timer一样,使用的时候一定要谨慎考虑。

以上所述是小编给大家介绍的Android实现定时器的五种方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android  # 实现定时器  # Android使用Handler实现定时器与倒计时器功能  # Android定时器和倒计时实现淘宝秒杀功能  # 详解Android实现定时器的几种方法  # Android 定时器实现图片的变换  # Android定时器Timer的停止和重启实现代码  # Android 实现定时器的四种方式总结及实现实例  # Android中使用定时器的三种方法  # Android定时器实现的几种方式整理及removeCallbacks失效问题解决  # 基于Android中实现定时器的3种解决方法  # Android定时器实现定时执行、重复执行、定时重复执行、定次数执行的多种方式  # 每隔  # 从现在起  # 是一个  # 多个  # 经常会  # 小编  # 移除  # 自己的  # 都是  # 有任何  # 这是  # 是个  # 是在  # 出了  # 是有  # 在此  # 不需要  # 你在  # 长时间  # 也很 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何基于云服务器快速搭建个人网站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  佛山企业网站制作公司有哪些,沟通100网上服务官网?  深圳网站制作的公司有哪些,dido官方网站?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何自定义建站之星网站的导航菜单样式?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  EditPlus中的正则表达式 实战(1)  制作电商网页,电商供应链怎么做?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  无锡营销型网站制作公司,无锡网选车牌流程?  如何在Windows 2008云服务器安全搭建网站?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  java中使用zxing批量生成二维码立牌  利用python获取某年中每个月的第一天和最后一天  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  JavaScript如何实现倒计时_时间函数如何精确控制  如何用PHP快速搭建CMS系统?  如何快速完成中国万网建站详细流程?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何制作一个表白网站视频,关于勇敢表白的小标题?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何快速启动建站代理加盟业务?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在企业微信快速生成手机电脑官网?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  网站制作壁纸教程视频,电脑壁纸网站?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  长沙做网站要多少钱,长沙国安网络怎么样?  如何在Windows环境下新建FTP站点并设置权限?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  详解Android图表 MPAndroidChart折线图  详解jQuery中基本的动画方法  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  移动端脚本框架Hammer.js  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区