android线程不在待机状态下运行

时间:2013-04-23 18:51:58

标签: java android multithreading standby

在我的计划中,我想检查一个新版本(从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。{{1声明为Variable) 好吧,当我启动private MainActivity main它检查新版本,然后,一小时后(所以我的设置),我检查Timer,我看到线程没有运行... < / p>

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

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

非常感谢! Luca Bertoncello

4 个答案:

答案 0 :(得分:0)

Here is a SO answer that can help you with this使用处理程序和postDelayed()。

但是,如果你想在应用程序未打开时运行它,那么你需要使用AlarmManger。你创建一个PendingIntent并创建一个Calendar实例设置您要检查的时间,然后使用setRepeating()上的AlarmManger。即使不在应用程序中,也可以检查。您也可以在manifest注册Boot_Completed,以便在设备关闭后重启后再次开始运行

Here is a good example to get you started with AlarmManager

答案 1 :(得分:0)

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

如果你想阻止它,请mTimer1.cancel();mTimer1.purge();清除计划队列。

答案 2 :(得分:0)

使用此代码

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

如果 1000 是延迟时间,如果您想第一次延迟,如果您不想要,请将其设置为 0

5000 是一个迭代时间

答案 3 :(得分:0)

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

我建议您查看AlarmManager,特别是setInexactRepeating