Android 用于调度固定速率任务的处理程序或计时器

Android 用于调度固定速率任务的处理程序或计时器,android,multithreading,android-handler,Android,Multithreading,Android Handler,我正在开发一个应用程序,要求它每x分钟上线一次,并检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是对于这种解决方案,最好的方法是什么?处理程序或计时器对象?您应该使用服务和报警接收器 这就是他们的目的。如果您在活动中使用计时器或任何其他机制,并将数据设置为每隔“几分钟”更新一次,则用户很有可能不在您的应用程序中,Android很可能会将其清理干净,使您的应用程序*不更新。警报将一直持续到设备关闭 >与广播收件人< /代码>,它将在X时间调用一个服务,让它完成工作,然后

我正在开发一个应用程序,要求它每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);