欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-13 21:27:46
一、timer timer是android直接启动定时器的类,timertask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用。 跟ha...

一、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实现定时器的五种方法实例详解,希望对大家有所帮助

上一篇:

下一篇: