问题描述:
在我的 android 应用程序中,当从警报响起后启动的 AsyncTask 执行远程 HTTP(“轮询”)调用时,我遇到了连接问题。
当标准的 Android 设置“启用永远在线的移动数据” (设置 -> 无线和网络 -> 移动网络)打开时,查找工作得很好。
可行的解决方案:警报消失,Android“服务”收到警报意图,启动后台线程(AsyncTask)。新线程获取部分唤醒锁,建立连接(轮询),通知用户并释放唤醒锁。
到目前为止,一切都很好。问题是,当始终开启“关闭”时,如果手机处于待机状态一段时间(> 30 分钟),大部分时间轮询都会失败。
由于轮询线程发送了通知,我直接得到了关于不成功的轮询尝试的反馈。
动机:
许多用户打开“始终开启”以减少电池消耗。因此,应用程序用户很可能会遇到问题。我想处理或防止用户将面临的“错误”。
解决方案尝试:
我做了很多实验,没有任何重大突破:
- 多次重试和中间休眠给手机一些时间来建立连接
- http参数(超时等)
- 不同的 HttpClient (Apache)
问题:
- 设置“永远在线”到底是什么意思,开发人员必须注意什么?
- 我想知道是否通常可以实现基于警报的轮询机制,即使“永远在线”被“关闭”也能够建立数据连接。
- 是否有任何替代解决方案(没有 C2DM 可能)?
更新:
似乎并非所有 Android 设备都具有“始终在线”设置。它似乎与设备有关,或者更有可能是依赖于提供商。