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

  一、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所定义的

  

  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实现定时器的五种方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  您可能感兴趣的文章: