(翻译)Android中的定时任务
16lz
2021-01-23
Tags: android
原文:https://guides.codepath.com/android/Repeating-Periodic-Tasks
在应用程序中使用”定时任务”是一种常见的需求,例如”定时从网络上获取新数据”,”运行一些动画”或者”定时更新UI”.通常有以下几种实现方法:
- Handler: 在UI线程上定制运行一个Runnable对象;
- ScheduledThreadPoolExecutor: 使用后台线程池执行任务
- AlarmManager: 让service在后台执行定时任务
- TimerTask: 不可靠,在非UI线程上运行.不建议使用(原因见: http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/)
以下一一介绍下1,2和3三种方法.
Handler
需要创建Handler对象,然后向消息队列里发送消息.
代码如下:
// 创建Handler对象Handler handler = new Handler();// 定义要执行的runnable对象private Runnable runnableCode = new Runnable() { @Override public void run() { // 做一些事情 Log.e("Handlers", "Called"); // 2秒后再次执行 handler.postDelayed(runnableCode, 2000); }};// 立即开始第一次执行handler.post(runnableCode);
删除正在执行的任务:
handler.removeCallbacks(runnableCode);
注意使用Handler是在UI线程上执行Runnable对象的.
ScheduledThreadPoolExecutor
例子代码:
class MyTask implements Runnable { @Override public void run() { System.out.println("Hello world"); } }ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);// 方式一long period = 100; exec.scheduleAtFixedRate( new MyTask(), 0, period, TimeUnit.MICROSECONDS);//方式二long delay = 100; exec.scheduleWithFixedDelay( new MyTask(),0, delay, TimeUnit.MICROSECONDS);
了解更多: https://codelatte.wordpress.com/2013/11/13/49/
AlarmManager
即使应用处于后台,使用这种方法也可起效.
详见: https://guides.codepath.com/android/Starting-Background-Services#using-with-alarmmanager-for-periodic-tasks
更多相关文章
- 线程安全
- FregServer进程,获取ServiceManager代理对象
- 2011.07.19——— android intent 传递list或者对象
- Android学习札记29:对线程更新UI界面的一些理解(2)
- Android的线程和线程池--《Android开发艺术探索》阅读笔记——第
- 【Android】Java四种线程池的使用
- Android使用Thread+Handler实现非UI线程更新界面