0

在我的程序中,我想检查一个新版本(从 获取数据HTTP)。
该功能完美运行,但我希望它每隔 X 次(可配置、一小时、一天等)在后台运行。

所以我写了这段代码:

    Timer mTimer1 = new Timer();
    PowerManager pm = (PowerManager) this.main.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = this.pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, MainActivity.PROGRAM);
    PowerManager.WakeLock wl.acquire();
    TimerTask mTt1 = new TimerTask()
    {
      public void run()
      {
        mTimerHandler.post(new Runnable()
          {
            public void run()
            {
// Do the check...
            }
          });
      }
    };

(因为这个函数在一个单独的类中,不是从 派生的Activity,所以我将父类传递给了构造函数this.main,以便我可以调用getSystemService。这Variable被声明为private MainActivity main)。
好吧,当我启动Timer它检查新版本时,一个小时后(所以我的设置),我检查Logs并看到线程没有运行......

我在互联网上搜索,我发现,我必须使用PARTIAL_WAKE_LOCK,我这样做......

任何想法,为什么我有这个问题?

非常感谢!卢卡·贝通切罗

4

4 回答 4

0

当手机进入睡眠状态时,您的活动将暂停执行,因此您的计时器将永远不会触发。使用PARTIAL_WAKE_LOCK可能不是一个好主意,因为它会在手机睡眠的整个过程中消耗电池。

我建议看一下AlarmManager,特别是setInexactRepeating

于 2013-04-23T19:04:26.573 回答
0

如果您使用的是 Timer,您还记得安排 TimerTask 吗?尝试 mTimer1.schedule(mTt1, delay, interval);

如果您想停止这种情况,请执行mTimer1.cancel();mTimer1.purge();清除计划队列。

于 2013-04-23T19:02:57.233 回答
0

使用此代码

 Timer timer = new Timer();
         timer.scheduleAtFixedRate( 
                    new java.util.TimerTask() {
                        @Override
                        public void run() {
                              // Your code
                   }},
                1000, 5000
                );

其中1000是后期延迟,如果你想第一次延迟,如果你不想,那就放0

5000是一个迭代时间

于 2013-04-23T19:03:24.690 回答
0

这是一个 SO 答案,可以使用处理程序和 postDelayed() 帮助您解决这个问题。

但是,如果您想在应用程序未打开的情况下运行它,那么您将需要使用AlarmManger。您创建一个PendingIntent并创建一个Calendar实例来设置您希望它检查的时间,然后setRepeating()AlarmManger. 即使不在应用程序中,也会对其进行检查。您也可以在manifestas中注册它,Boot_Completed以便在设备关闭后重新启动后再次开始运行

这是一个让您开始使用 AlarmManager 的好例子

于 2013-04-23T19:00:10.450 回答