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

时间:2014-01-10 06:35:36

标签: android multithreading android-handler

我正在开发一个应用程序,要求它每隔x分钟上线并检查一些新数据。为防止繁重的网络和数据使用,任务应以固定速率运行,但这种解决方案的最佳使用方法是什么? HandlerTimer对象?

6 个答案:

答案 0 :(得分:3)

使用Timer

有一些缺点
  • 它只创建一个线程来执行任务和任务 运行时间太长,其他任务受损。
  • 它不处理任务抛出的异常,并且线程只是终止,这会影响 其他计划任务,它们永远不会运行。

另一方面,ScheduledThreadPoolExecutor正确处理所有这些问题,并且使用Timer没有意义..有两种方法可以在你的情况下使用

  • scheduleAtFixedRate(...)

  • scheduleWithFixedDelay(..)

    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);
    

要取消执行者,请使用此 - ScheduledFuture

// 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);

答案 1 :(得分:0)

您应该使用服务和AlarmReceiver Like This 这就是他们的目的。如果您在活动中使用计时器或任何其他机制,并且您将数据设置为每隔“几分钟”更新一次,那么用户很可能不会在您的应用中,并且Android可能会很好地清理它,使您的应用不会更新。闹钟将一直亮着,直到设备关闭。

答案 2 :(得分:0)

如果您正在寻找良好的性能和更少的电池消耗,您应该考虑与Alarm manager集成的broadcast Reciever将在X时间内调用服务并让它完成工作然后将其关闭试。

但是,使用timerhandler时,您需要始终让您的服务在后台运行。除非,您希望它在应用程序运行时获取数据,因此您不需要服务。

如果您选择是handler还是timer,那么请使用计时器,因为它更简单,可以更好地完成工作。 handlers通常用于使用RunnableMesseges更新用户界面。

答案 3 :(得分:0)

可能是Alarm Manager,timer,handler或ScheduledThreadPoolExecutor。

看看这个:

Scheduling recurring task in Android

这取决于用户不在应用程序时是否会发生更新(例如,一旦用户离开发送短信,检查是否会停止,或者轮询是否会继续?)可以在UI上运行检查线程然后从服务或AsyncTask或其他线程产生加载?也许这一切都不重要......

答案 4 :(得分:0)

如果您在用户未查看应用时不需要更新任何内容,请使用计时器。服务将是一种矫枉过正。以下是实现此目的的示例代码:

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

}

答案 5 :(得分:0)

警报管理器或处理程序。如果您使用handler和postDelayed,则您的流程不必始终保持活动状态。

事实上,官方建议使用Handler而不是Timer或TimerTask:http://android-developers.blogspot.ru/2007/11/stitch-in-time.html