android定时任务的优劣

来源:互联网 发布:淘宝天猫内部优惠券网 编辑:程序博客网 时间:2024/06/02 02:25

android定时任务的优劣

在项目中,对于android的定时任务请求我在这方面还是有点陌生,总之来说,还是有点懒。
不过我有一个好导师,让我这懒的习惯,越来越没有吧
话不多说,进入主题。在网上找了文档,看了下,android的定时任务分为三种。

android的定时任务有三种方式

  • 采用Handler与线程的sleep(long)方法
  • 采Handler的postDelayed(Runnable, long)方法
  • 采用Handler与timer及TimerTask结合的方法

采用Handler与线程的sleep(long)方法不建议使用(因为是Java的方式)

handler主要用来处理接受到的消息。
1.定义一个Handler类,用于处理接受到的Message

Handler handler=new Handler(){    public void handlerMessage(Message msg){            super.handleMessage(msg);    }}

2.新建一个实现Runnable接口的线程类

public class MyThread implements Runnable {      @Override      public void run() {          // TODO Auto-generated method stub          while (true) {              try {                  Thread.sleep(10000);// 线程暂停10秒,单位毫秒                  Message message = new Message();                  message.what = 1;                  handler.sendMessage(message);// 发送消息              } catch (InterruptedException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }          }      }  

}
3.在需要启动线程的地方加入下面语句:

 new Thread(new MyThread()).start(); 

启动线程后,线程每10秒发送一次消息
不好的是:线程会一直在后台运行,会使内存变慢。

采Handler的postDelayed(Runnable, long)方法(android最简单的实现)

  1. 定义一个Handler类
Handler handler=new Handler();  Runnable runnable=new Runnable() {      @Override      public void run() {          // TODO Auto-generated method stub          //要做的事情          handler.postDelayed(this, 2000);      }  };  
  1. 启动计时器
handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.  
  1. 停止计时器
handler.removeCallbacks(runnable);可以在不用的时候及时停止线程

采用Handler与timer及TimerTask结合的方法(比较多的任务时建议使用)

  1. 定义定时器、定时器任务及Handler句柄
private final Timer timer = new Timer();  private TimerTask task;  Handler handler = new Handler() {      @Override      public void handleMessage(Message msg) {          // TODO Auto-generated method stub          // 要做的事情          super.handleMessage(msg);      }  };  
  1. 初始化计时器任务
    [java] view plaincopy
task = new TimerTask() {      @Override      public void run() {          // TODO Auto-generated method stub          Message message = new Message();          message.what = 1;          handler.sendMessage(message);      }  };   
  1. 启动定时器
timer.schedule(task, 2000, 2000);   
  1. 停止计时器
timer.cancel();

定时器任务就是说当定时器到达指定的时间要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。

java.util.Timer.schedule(TimerTask task, long delay):这个方法是说dalay/1000秒后执行tak只执行一次。
ava.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用timer.cancel();取消计时器的执行。
每一个Timer仅对应唯一一个线程。Timer不保证任务执行的十分精确。Timer类的线程安全的。

AlarmManager

看了很多的资料,大家都提到了AlarmManager这个闹钟的定时器。
AlarmManager是使用机制有的称呼为全局定时器,称为闹钟。通过对它的使用,它的作用和Timer有点相似。
都有两种相似的用法:
在指定时长后执行某项操作,周期性的执行某项操作。
AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCas或者开启一个Service。

AlarmManager常用的方法有以下几个:

// 取消已经注册的与参数匹配的定时器
void cancel(PendingIntent operation)
//注册一个新的延迟定时器
void set(int type, long triggerAtTime, PendingIntent operation)
//注册一个重复类型的定时器
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
//注册一个非精密的重复类型定时器
void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
//设置时区
void setTimeZone(String timeZone)

定时器主要类型(type参数):

public static final int ELAPSED_REALTIME
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
public static final int RTC
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
public static final int RTC_WAKEUP
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。

但是 AlarmManager一旦启动就会一直在后台运行(除非执行cancel方法),可以在“应用管理”中看到这个应用状态是正在运行。 “强行停止”可以让Alarmmanager停掉。
AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)
参考文献(http://www.tuicool.com/articles/zyI3a2U)
[参考文献](http://www.2cto.com/kf/201311/2558
参考文献(http://blog.csdn.net/job_dinge/article/details/7929750)42.html)42.html)

0 0
原创粉丝点击