2015-08-26 2 views
1

У меня есть Runnable r, который запускается периодически один раз в минуту на handler.postDelayed(60*1000). И я проверяю свой код на реальном устройстве.Почему зарядка состояния телефона влияет на поведение моего приложения

Однако я замечаю, что когда телефон заряжается (AC или USB), он работает хорошо, но если телефон отключен, Runnable r будет работать только один раз каждые 20 минут или даже хуже, несколько часов. Спасибо за любую помощь!

Ниже приведен код:

private final Runnable listen_to_server = new Runnable(){ 
    public void run(){ 
     new Thread() { 
      public void run() { 
       try { 

        handler.sendMessage(handler.obtainMessage(PING_SERVER,"listen")); 
        synchronized (listen) { 
         listen.wait(); 
        } 
        handler.postDelayed(listen_to_server, 50000); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }.start(); 
    } 
}; 

В обработчике:

handler=new Handler() { 
     @Override 
     public void handleMessage(final Message msg) { 
      switch (msg.what) { 
       case PING_SERVER: 
        String type = (String) msg.obj; 
        add_log("ping server"); // print to screen and Log.d 
        ... 
        ... 
      } 
     } 
    } 
+0

разместить свой работоспособный код и как вы вызываете его –

+0

вы можете разместить код пожалуйста? –

+0

Ваш телефон, вероятно, переходит в глубокий спящий режим, чтобы сэкономить аккумулятор, если он не подключен через USB, и экран выключен. Таймеры AFAIK не будут обновляться вообще/не так часто во время глубокого сна. – Michael

ответ

1

Ссылаясь на this link я думаю, что проблема может быть, как они сказали:

Android не операционная система реального времени. Все гарантии postDelayed() заключаются в том, что это будет как минимум количество миллисекунд . Помимо этого будет зависеть прежде всего от того, что делает основной поток приложений (если вы его связываете, он не может обработать Runnable), а во-вторых, что еще происходит на устройстве (услуги выполняются с приоритетом фона и, следовательно, получить меньше процессорного времени , чем на переднем плане).

Как это исправить? в this пост решение было следующее:

Вы, вероятно, лучше удачи, используя AlarmManager такой длительной задержки с. Обработчик лучше всего подходит для тиков и тайм-аутов, а ваше приложение - на переднем плане.

поэтому попробуйте реализовать AlarmManager глядя на the doc.

Надежда я помогла :)

+0

Спасибо за ссылку. Но мое приложение действительно находится на переднем плане - я даже убил все другие приложения - и я хочу оставить свое приложение часами, с runnable работает один раз в минуту –

+0

@ ZhangYifan Вы пытались использовать сервис? –

+0

в любом случае, не уверен, но правильно ли синтаксис Runnable? Я думаю, что перед запуском вам нужно @Override, и после него вам не понадобится «новый Thread() {». Может быть, я ошибаюсь, не знаю –