我正在使用Handler每隔10秒发送一条消息。当我关闭屏幕(设备进入睡眠模式)时会出现问题。消息每30秒发送一次 - 2分钟而不是每10秒发送一次。为什么会这样?如何解决这个问题?
public void PingTask() {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
try {
sendMSG("ping");
} catch (Exception e) {}
handler.postDelayed(this, 10000);
}
};
runnable.run();
}
从AsyncTask调用PingTask() - onPostExecute()。
答案 0 :(得分:2)
Android正在关闭你的CPU。使用WakeLock可防止您的设备进入某种睡眠模式。
您还可以使用alarmmanager每秒发送一条消息。警报管理器会自动阻止您的设备进入睡眠模式。
答案 1 :(得分:2)
我也看到同样的事情,处理程序或计时器都没有给我一个准确的延迟,例如放入6000毫秒的延迟会给我延迟500-7000毫秒之间的延迟,这非常烦人。
使用唤醒锁可能会使用太多电池。所以在这里我有一个辅助类,它应该运行的时间,使用postAtTime代替并重新发布自己。它可以轻松地以可变间隔处理更复杂的不同任务计划。
public void PingTask() {
/** here is how to use it */
IntervalTask task = new IntervalTask();
task.run();
}
class IntervalTask implements Runnable{
long runAtTime = 0;
Handler handler = new Handler();
public void run(){
/** According to documentation, it uses uptimeMillis */
long currentTime = SystemClock.uptimeMillis();
/** only do it if it is time */
if (currentTime > runAtTime){
/** update it */
runAtTime = currentTime + 10000;
/** do you what you want to do here */
sendMSG("ping");
}
handler.postAtTime(this, runAtTime);
}
}