Android 用于调度固定速率任务的处理程序或计时器
我正在开发一个应用程序,要求它每x分钟上线一次,并检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是对于这种解决方案,最好的方法是什么?Android 用于调度固定速率任务的处理程序或计时器,android,multithreading,android-handler,Android,Multithreading,Android Handler,我正在开发一个应用程序,要求它每x分钟上线一次,并检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是对于这种解决方案,最好的方法是什么?处理程序或计时器对象?您应该使用服务和报警接收器 这就是他们的目的。如果您在活动中使用计时器或任何其他机制,并将数据设置为每隔“几分钟”更新一次,则用户很有可能不在您的应用程序中,Android很可能会将其清理干净,使您的应用程序*不更新。警报将一直持续到设备关闭 >与广播收件人< /代码>,它将在X时间调用一个服务,让它完成工作,然后
处理程序
或计时器
对象?您应该使用服务和报警接收器
这就是他们的目的。如果您在活动中使用计时器或任何其他机制,并将数据设置为每隔“几分钟”更新一次,则用户很有可能不在您的应用程序中,Android很可能会将其清理干净,使您的应用程序*不更新。警报将一直持续到设备关闭如果你正在寻找一个好的性能和更少的电池消耗,你应该考虑一个<代码>闹钟管理器< /C> >与<代码>广播收件人< /代码>,它将在X时间调用一个服务,让它完成工作,然后再次关闭它。 但是,使用
计时器
或处理程序
您需要让您的服务始终在后台运行。除非,您希望它在应用程序运行时获取数据,因此不需要服务
如果您的选择是
处理程序
还是计时器
,那么请选择计时器,因为它更简单,可以以更好的性能完成工作<代码>处理程序通常用于使用Runnable
或Messeges
更新UI,可能是报警管理器、计时器、处理程序或ScheduledThreadPoolExecutor
看看这个:
这取决于用户不在应用程序中时是否会发生更新(例如,检查是否会在用户离开发送SMS时停止,或者轮询是否应继续?)检查是否可以在UI线程上运行,然后从服务或异步任务或其他线程生成加载?也许这些都不重要……如果用户不查看应用程序时您不需要更新任何内容,请使用计时器。服务太过分了。以下是实现此目的的示例代码:
final Runnable updateRunnable = new Runnable() {
public void run() {
// Fetch the date here in an async task
}
};
final Handler myHandler = new Handler();
private Timer myTimer;
private void updateUI() {
myHandler.post(updateRunnable);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... other things here
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
updateUI(); // Here you can update the UI as well
}
}, 0, 10000); // 10000 is in miliseconds, this executes every 10 seconds
// ... more other things here
}
使用定时器有一些缺点
- 它只创建单个线程来执行任务,如果任务 运行时间太长,其他任务会受到影响李>
- 它不处理任务引发的异常,线程只是终止,这会影响 其他计划的任务,它们永远不会运行
ScheduledThreadPoolExecutor
正确地处理了所有这些问题,使用计时器是没有意义的。。有两种方法可用于您的案例
- scheduleAtFixedRate(…)
- 具有固定延迟的时间表(…)
报警管理器或处理程序。如果您使用handler和postDelayed,那么您的进程不必一直处于活动状态
事实上,官方建议使用Handler,而不是Timer或TimerTask:是的,当用户运行应用程序时,我需要加载新闻,但我想检查是否有新数据到达,我使用过AlarmManager一次,但即使找到应用程序或没有internet,它仍会运行,一旦我注册了它,你就可以在运行alarm manager之前或在开始获取新闻之前在服务中添加对internet的检查
class LongRunningTask implements Runnable {
@Override
public void run() {
System.out.println("Hello world");
}
}
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 100; // the period between successive executions
exec.scheduleAtFixedRate(new LongRunningTask (), 0, duration, TimeUnit.MICROSECONDS);
long delay = 100; //the delay between the termination of one execution and the commencement of the next
exec.scheduleWithFixedDelay(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
// schedule long running task in 2 minutes:
ScheduledFuture scheduleFuture = exec.scheduleAtFixedRate(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
... ...
// At some point in the future, if you want to cancel scheduled task:
scheduleFuture.cancel(true);