2012-08-07 153 views
0

我有每10秒钟对服务器(http客户端)做一些请求的应用程序。我读了很多关于应用程序生命周期我的应用程序具有前景标志服务,当android处于“活动状态”时,它可以很好地工作(应用程序可以工作)。我没有真正的android手机,所以我正在模拟器上测试,但我的朋友在智能手机上测试它,他注意到当他离开他的手机时,请求会发布10,30分钟甚至一小时。如果他打开屏幕,则请求时间回到10秒(他可以访问服务器以便看到日志)。这是已知的行为吗?因为他从谷歌安装了gmail notifier,并且这个问题(很大的延迟)。任何解决方案?我的服务有定时器任务(所以请求被异步任务发送)Android - 手机处于空闲模式时网络速度慢

问候

回答

1

首先,如果你是轮询每10秒,这是会流失大量的电池和网络带宽。

我建议使用较低频率或服务器推送。

对于轮询问题,您如何实施轮询? 你使用计时器吗?如果是这样,你传递了什么选项?或者你使用睡眠10秒的线程?

根据不同的版本,Android可能会关闭所有进程,或延迟网络请求每30分钟运行一次以保持电池电量和带宽。 (启动网络组件会耗尽大量电量,因此如果您的应用打开网络,请进行轮询,然后关闭它,Android可能会安排它与系统上的所有其他请求保持一致。)

您能提供给我们关于您如何进行投票的更多信息吗?

UPDATE

您可能需要安排一个“唤醒锁定”因此Android知道何时唤醒为您服务。我认为,默认情况下,android并不会唤醒定时器的请求,而定时器的请求会按照我的解释进行安排。另一方面,WakeLocks可以强制android唤醒。

请参阅this questionWakeLock Documentation 请确保您传递了正确的参数,以免打开屏幕。 (会真的很烦。)

更新 我仍然建议使用服务器推送,这将节省电池和带宽,同时保持更新实时。

+0

服务启动此计时器: @Override 公众诠释onStartCommand(意向意图,整数标志,整数startId){ \t \t timerMain =新定时器(真); \t \t timerMain.schedule(new mainTask(),1000,9000); \t \t \t \t startStatusNotification(); //我们希望此服务继续运行,直至明确地 //停止,因此返回粘​​性。 return START_STICKY; } 在mainTask()方法中调用httpclient请求。我知道这可能会耗尽电池电量,但这个应用程序有点“我想要立即这个事件”,用户知道它并知道风险。为什么android认为用户? – Dibo 2012-08-07 23:02:03

+0

我还没有找到关于30分钟的信息,但通常你是对的。有三种无线电状态:全功率,低功率和空闲,并在不同时段之间切换。详细描述android如何使用网络工具可以在这里找到(http://developer.android.com/training/efficient-downloads/efficient-network-access.html) – marwinXXII 2012-08-07 23:07:50

+0

您可能需要安排一个'WakeLock',以便安卓知道什么时候醒来为您服务。我认为,默认情况下,android并不会唤醒定时器的请求,而定时器的请求会按照我的解释进行安排。另一方面,WakeLocks可以强制android唤醒。 [我更新了我的答案。] – Madushan 2012-08-07 23:35:58