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

2 篇文章 0 订阅
1 篇文章 0 订阅
简单介绍

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

实现原理
  1. 首先定义了几个参数
    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是主要的角色^^! 接口是对外的任务和核心,重复执行单元在其中完成。
2. 基本参数设置
JobDriver提供了基本参数的设置方法,需要设置的变量包括重复执行单元,时间间隔,方法如下。

    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。
3. 对外提供了三个方法

    public JobDriver startJobInMilliSec(long millis){
        handler.postDelayed(runnable,millis);
        return this;
    }

在millis毫秒后开始

    public JobDriver startJobNow(){
        handler.post(runnable);
        return this;
    }

立刻开始

    public JobDriver stopJob(){
        handler.removeCallbacks(runnable);
        return this;
    }

停止任务

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

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

完整的代码如下
    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);
    }
}
调用方法
    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引用什么的,很可能回引发泄漏,所以,使用该类的时候一定要确保终止函数的调用来放置内存泄漏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值