TimeTask一个轻量的多任务定时队列框架

2,447 阅读2分钟
原文链接: github.com

TimeTask是一个轻量简洁的定时任务队列框架,专注处理多组任务分发工作 TimeTask内部的实现时基于AlarmManager+广播,在任务与系统api中间做了较好的封装

简单来说满足以下应用场景:

  • 1.当你需要为任务定时启动和结束
  • 2.你有多组任务,时间线上可能存在重叠的情况

目前应用的场景:

  • 1.电视机顶盒媒体分发
  • 2.android大屏幕广告机任务轮播

引入

根gradle上添加

	repositories {
			...
			maven { url 'https://jitpack.io' }
		}
dependencies {
    compile 'com.github.BolexLiu:TimeTask:1.0'
}

简单使用

1.定义一个Task为你的任务对象,注意基类Task对象已经包含了任务的启动时间和结束时间

    class  MyTask extends Task {
        //// TODO: 这里可以放置你自己的资源,务必继承Task对象
        String name;
    }

2.定义一个任务接收器

   TimeHandler<MyTask> timeHandler = new TimeHandler<MyTask>() {
        @Override
        public void exeTask(MyTask mTask) {
               //到点执行
              // 一般来说,在exeTask方法中处理你的逻辑就好可以,过期和未来的都不需要关注 
        }

        @Override
        public void overdueTask(MyTask mTask) {
                 //过期执行
        }

        @Override
        public void futureTask(MyTask mTask) {
              //未来将要执行
        }
    };

3.定义一个任务分发器,并添加接收器

 
        TimeTask<MyTask> myTaskTimeTask = new TimeTask<>(MainActivity.this); // 创建一个任务处理器
        myTaskTimeTask.addHandler(timeHandler); //添加时间回掉

4.配置你的任务时间间隔,(启动时间,结束时间)

    private List<MyTask> creatTasks() {
        return  new ArrayList<MyTask>() {{
            MyTask BobTask = new MyTask();
            BobTask.setStarTime(System.currentTimeMillis());   //当前时间
            BobTask.setEndTime(System.currentTimeMillis()+5*1000);  //5秒后结束
            BobTask.name="Bob";
            add(BobTask);

            MyTask benTask = new MyTask();
            benTask.setStarTime(System.currentTimeMillis()+10*1000); //10秒开始
            benTask.setEndTime(System.currentTimeMillis()+15*1000); //15秒后结束
            benTask.name="Ben";
            add(benTask);
        }};
    }

5.添加你的任务队列,跑起来.

        
        myTaskTimeTask.setTasks(creatTasks());//创建时间任务资源 把资源放进去处理
        myTaskTimeTask.startLooperTask();//  启动

这样下来,当调用 myTaskTimeTask.startLooperTask()后,会先分发给timeHandler名称为Bob的任务。 随后10秒分发Ben名称的任务。 任务处理器会根据我们配置的启动时间和结束时间进行分发工作。

完整代码参考app中的列子。

Api

TimeTask

  • TimeTask(Context mContext);//初始化
  • setTasks(List mES);//设置任务列表
  • addHandler(TimeHandler mTH);//添加任务监听器
  • startLooperTask();//启动任务
  • stopLooper();//停止任务
  • spotsTask(List mSpotsTask);//插播任务
  • onColse();//关闭 防止内存泄漏

代码中已有详细注释,看原理读代码最好了。

注意:

  • 1.务必确保你的任务队列中的任务时已经按照时间排序的。
  • 2.务必使用泛型继承Task任务。

原理底层解析后续出文章。