使用Handler来实现实现事件重复驱动类JobDriver

#####简单介绍
这里利用Android OS的Handler类实现了一个简易的定频事件驱动类,使用起来简单方便,比如在Slider滑动效果,计数器以及其他需要定频事件驱动的场合。

#####实现原理

  1. 首先定义了几个参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private Runnable runnable;
    private long interval;//默认1s
    private long tickTime;
    private Handler handler;
    private JobInterface jobInterface;å
    {
    tickTime = 0;
    interval = 1000;
    handler = new Handler();
    }

其中runnable是任务,interval为间隔时间,tickTime是计算执行了多少次,Handler是主要的角色^^! 接口是对外的任务和核心,重复执行单元在其中完成。

  1. 基本参数设置
    JobDriver提供了基本参数的设置方法,需要设置的变量包括重复执行单元,时间间隔,方法如下。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public JobDriver setJob(final JobInterface job, long intervalTime){
    this.interval = intervalTime;
    this.jobInterface = job;
    runnable = new Runnable() {
    @Override
    public void run() {
    if(jobInterface!=null) jobInterface.nextTick(tickTime);
    tickTime++;
    handler.postDelayed(this, interval);
    }
    };
    return this;
    }

代码很容易理解,主要是几个postDelay接着另外一个postDelay。

  1. 对外提供了三个方法
    1
    2
    3
    4
    public JobDriver startJobInMilliSec(long millis){
    handler.postDelayed(runnable,millis);
    return this;
    }

在millis毫秒后开始

1
2
3
4
public JobDriver startJobNow(){
handler.post(runnable);
return this;
}

立刻开始

1
2
3
4
public JobDriver stopJob(){
handler.removeCallbacks(runnable);
return this;
}

停止任务

1
2
3
public interface JobInterface{
void nextTick(long tickTime);
}

接口主要向外提供了一个tickTime便于逻辑操作。

#####完整的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class JobDriver {
private Runnable runnable;
private long interval;//默认1s
private long tickTime;
private Handler handler;
private JobInterface jobInterface;
{
tickTime = 0;
interval = 1000;
handler = new Handler();
}
public JobDriver setJob(final JobInterface job, long intervalTime){
this.interval = intervalTime;
this.jobInterface = job;
runnable = new Runnable() {
@Override
public void run() {
if(jobInterface!=null) jobInterface.nextTick(tickTime);
tickTime++;
handler.postDelayed(this, interval);
}
};
return this;
}
public JobDriver startJobInMilliSec(long millis){
handler.postDelayed(runnable,millis);
return this;
}
public JobDriver startJobNow(){
handler.post(runnable);
return this;
}
public JobDriver stopJob(){
handler.removeCallbacks(runnable);
return this;
}
public interface JobInterface{
void nextTick(long tickTime);
}
}

#####调用方法

1
2
3
4
5
6
new JobDriver().setJob(new JobDriver.JobInterface() {
@Override
public void nextTick(long tickTime) {
Toast.makeText(getContext(),"tickTime -> "+tickTime,Toast.LENGTH_SHORT).show();
}
},4000).startJobNow();

以上代码演示了每个4秒钟执行Toast的操作。

#####与TimerTask比较
TimerTask比较消耗资源,同时在UI线程里面执行时,其被禁用掉了。

#####注意点

JobDriver的callback是死循环方式调用的,唯一可以终止循环的办法是使用stopJob()函数,如果runnable中持有了activity引用什么的,很可能回引发泄漏,所以,使用该类的时候一定要确保终止函数的调用来放置内存泄漏.
对了,在这里再啰嗦一点,千万不要使用JobDriver去做重复的耗时操作,因为使用handler重复执行的事件是在主ui线程中执行的。