Android-поток не работает в режиме ожидания

В моей программе я хотел бы проверить наличие новой версии (получение данных из 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 ответа

Если вы используете таймер, вы помните, чтобы запланировать свой таймер? Пытаться mTimer1.schedule(mTt1, delay, interval);

И если вы хотите остановить это, сделайте mTimer1.cancel();а также mTimer1.purge(); очистить очередь расписания.

Используйте этот код

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

Где 1000 - почтовая задержка, если вы хотите задержку в первый раз, если вы не хотите, чем ее поставить 0

5000 - это время итерации

Когда телефон перейдет в спящий режим, выполнение будет приостановлено для вашей активности, и, таким образом, ваш таймер никогда не сработает. С помощью PARTIAL_WAKE_LOCK это, вероятно, не очень хорошая идея, поскольку она будет расходовать заряд батареи все время, пока ваш телефон спит.

Я бы посоветовал взглянуть на AlarmManager и, в частности, установить InexactRepeating

Вот SO ответ, который может помочь вам с помощью обработчика и postDelayed().

Однако, если вы хотите запустить это, даже если приложение не открыто, вы захотите использовать AlarmManger. Вы создаете PendingIntent и создать Calendar экземпляр, чтобы установить время, которое вы хотите проверить, затем используйте setRepeating() на AlarmManger, Это будет проверять, даже если не в приложении. Вы также можете зарегистрировать его в manifest как Boot_Completed так что он снова запустится после перезагрузки, когда устройство выключено

Вот хороший пример для начала работы с AlarmManager

Другие вопросы по тегам