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
так что он снова запустится после перезагрузки, когда устройство выключено