我正在编写一个数据记录器应用程序,每5分钟需要进行一次HTTP请求。用户已经知道电池的耗电量,这对我来说没问题。我正在使用前台服务,并且有一个处理程序线程,每5分钟会发布可运行任务。当手机进入DOZE MODE时,似乎线程会被挂起,没有可运行的任务会执行。这是正常的行为还是我漏掉了什么?
如果您能提供任何帮助,将不胜感激。
启动线程的服务代码:
启动线程的服务代码:
private void startTheForegroundService() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(MainService.this);
builder.setPriority(Notification.PRIORITY_HIGH);
startForeground(1000, builder.build());
httpThread = new HttpThread("Ping Thread", Thread.NORM_PRIORITY);
httpThread.start();
httpThread.loop();
}
多线程代码:
public class HttpThread extends HandlerThread {
public Handler mHandler;
public HttpThread(String name, int priority) {
super(name, priority);
}
public synchronized void waitUntilReady() {
mHandler = new Handler(getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
}
public void loop() {
waitUntilReady();
mHandler.post(new Runnable(){
@Override
public void run() {
//code for the http request.
}
});
}
}
ScheduledExecutorService
而不是基于Handler
的方法,并查看是否有更好的运气。 - CommonsWareScheduledExecutorService
、Handler
和任何其他进程内定时解决方案只有在进程运行时才能工作。 - CommonsWare