【问题标题】:Running a service in separate thread and waking it every 10 minutes?在单独的线程中运行服务并每 10 分钟唤醒一次?
【发布时间】:2012-02-14 22:04:11
【问题描述】:

我的应用每 10 分钟访问一次 Web 服务以访问数据(即使应用不在前台)。最好的方法是什么?

首先我需要在单独的线程中启动我的服务吗? 以及如何使其每 10 分钟从服务器获取更新?有些人说 handler.postdelayed 和一些使用警报管理器。哪个更好,我们有一些例子吗?

【问题讨论】:

    标签: java android multithreading android-service


    【解决方案1】:

    如果更新将在您的应用程序运行时发生,您可以使用计时器(如其他答案中所建议的那样)或更新的 ScheduledThreadPoolExecutor
    如果您的应用程序即使在未运行时也会更新,您应该使用AlarmManager

    警报管理器适用于您希望拥有 应用程序代码在特定时间运行,即使您的应用程序是 当前未运行。

    请注意,如果您打算在应用程序关闭时更新,则每十分钟更新一次是相当频繁的,因此可能有点太耗电了。

    【讨论】:

    【解决方案2】:

    Jeffrey Sharkey 在Google IO 2009 上就该主题进行了出色的演示,请仔细观看幻灯片 21。

    这应该可以很好地介绍有关该主题的最佳做法。

    摘录:不要使用处理程序或计时器,请使用 AlarmManager 和 setInexactRepeating(..)

    【讨论】:

      【解决方案3】:

      实际上,我使用Timer 处理完全相同的情况,它对我有用。

      timer = new Timer();
      
          timer.scheduleAtFixedRate(new TimerTask() {
      
              synchronized public void run() {
      
                  \\ here your todo;
                  }
      
              }}, 60000, 60000);
      

      【讨论】:

      • Timer 有一些缺点,ScheduledThreadPoolExecutor 解决了这个问题。所以这不是最好的选择
      【解决方案4】:

      您可以使用java.util.TimerScheduledThreadPoolExecutor(首选)来安排在后台线程上定期执行的操作。

      这是使用后者的示例:

      ScheduledExecutorService scheduler =
          Executors.newSingleThreadScheduledExecutor();
      
      scheduler.scheduleAtFixedRate
            (new Runnable() {
               public void run() {
                  // call service
               }
            }, 0, 10, TimeUnit.MINUTES);
      
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多