欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现定时任务的几种方式

程序员文章站 2022-03-29 20:16:09
一、AlarmManagerAlarmManager是系统开放的闹钟功能,使用方式和普通的manager没有区别。AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); // Schedule the alarm! Intent intent = new Intent(XXXXX);PendingIntent sender = PendingIntent.getBroadcast(mco...

一、AlarmManager

AlarmManager是系统开放的闹钟功能,使用方式和普通的manager没有区别。

AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);  
// Schedule the alarm!  
Intent intent = new Intent(XXXXX);
PendingIntent sender = PendingIntent.getBroadcast(mcontext,requestCode, intent, 0);  
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  
                         firstTime, 30*1000, sender); 

上面就是定时器的基本用法,先获取manager,然后定义闹钟的flag,循环时间,到指定时间发出的pendingIntent。

一般都发出的pendingIntent都是广播,自定义一个广播接收器,就可以通过接收这个广播,来处理自己的功能逻辑了。

这里需要注意在独立进程中配置,这是android所定义的

<receiver android:name="com.xxxx.Receiver" android:process=":remote" />
优点总结

1,Alarm定时不需要程序自身去维护,而又系统来维护,使得程序更好避免了容易出错问题,更是占用系统资源,cpu占有率。

2,即使程序退出后,程序自身不会有任何烦恼的问题,系统到时间自动调用对应组件执行定义好的逻辑

3,定时的多样性,包括一次定时,循环定时(在xx年x月x日执行,周一至周五执行,每天几点几分执行。。。)

二、Handler

Handler可以帮助我们在子线程中操作UI线程,例如子线程解析数据,解析结束后通知UI刷新界面。他本身也可以实现定时器。

private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0:
                // 移除所有的msg.what为0等消息,保证只有一个循环消息队列再跑
                handler.removeMessages(0);
                // app的功能逻辑处理
                ...
                // 再次发出msg,循环更新
                handler.sendEmptyMessageDelayed(0, 1000);
                break;

            case 1:
                // 直接移除,定时器停止
                handler.removeMessages(0);
                break;

            default:
                break;
            }
        };
    };
优点总结

每次循环都是在主线程中操作,避免了子线程和主线程之间的穿插交互。

三、Timer

Timer是Android直接启动定时器的类。

// 初始化定时器
Timer timer = new Timer();
timer.schedule(new TimerTask() {

    @Override
    public void run() {
        Log.e("lzp", "timer excute");
    }
}, delay, period);

// 停止定时器
private void stopTimer(){
    if(timer != null){
        timer.cancle();
        // 一定设置为null,否则定时器不会被回收
        timer = null;
    }
}

delay : 从定时器初始化成功 开始启动 的延迟时间。
period:定时器的间隔时间。

优点总结

Timer的使用很简单,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用。

四、Thread

Thread实现定时器是创建一个子线程,在里面while循环,可以通过handler来更新UI。

private MyThread thread;

    private class MyThread extends Thread {

        public boolean stop;

        public void run() {
            while (!stop) {
                // 处理功能

                // 通过睡眠线程来设置定时时间
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    };

    /**
     * 启动线程
     * */
    private void start() {
        if (thread == null) {
            thread = new MyThread();
            thread.start();
        }
    }

    /**
     * 停止线程
     * */
    private void stop() {
        if (thread != null) {
            thread.stop = true;
            thread = null;
        }
    }

五、ScheduledExecutorService实现定时任务

ScheduledExecutorService是从JDK1.5做为并发工具类被引进的,存在于java.util.concurrent,这是最理想的定时任务实现方式。
相比于上面两个方法,它有以下好处:
(1)、相比于Timer的单线程,它是通过线程池的方式来执行任务的,所以可以支持多个任务并发执行 ,而且弥补了上面所说的Timer的缺陷
(2)、可以很灵活的去设定第一次执行任务delay时间
(3)、提供了良好的约定,以便设定执行的时间间隔

public class ScheduledExecutorServiceTask 
{  
    public static void main(String[] args) 
    {  
        final TimerTask task = new TimerTask()  
        {  
            @Override  
            public void run()  
            {  
               //execute task  
            }  
        };   
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);  
        pool.scheduleAtFixedRate(task, 0 , 1000, TimeUnit.MILLISECONDS);  

    }  
}

本文地址:https://blog.csdn.net/weixin_42600398/article/details/107189160