android - 在定时(等待)、wifi 和电源锁定方面,在 android 服务中进行轮询的 "right"方法是什么

标签 android service locking wait thread-sleep

我有一个安卓应用程序,可以从互联网上获取一些信息。通常它通过我的服务器获取它,它收集数据并通过 GCM 发送它,但有一种情况,当它启动每 2 秒轮询 3rd 方 REST API 的服务时,它进入回退模式。我想知道实现这个的正确方法是什么(优点/缺点)

第一种方式:我的第一种实现方式是使用 AlarmManager 和 BroadcastReceiver。在 BroadcastReceiver 中,我锁定了 PowerManager.WakeLock 和 WifiManager.WifiLock,然后当我收到响应时,我将它们解锁,并设置 AlarmManager 2 秒。

然后我认为,我由此实现的可能是我的应用程序几乎不会在 android 设置中显示为电池消耗者,而基本上它确实会耗尽电池电量,因为 WiFi 可能没有断开 2 秒,然后重新连接。还注意到,由于 BroadcastReceiver,我每 2 秒创建一个 RestClient 的新实例,然后对其进行垃圾回收。所以我正在考虑更改实现:

第二种方式:当我启动 PollService 时锁定 PowerManager、WifiManager(这会导致我的应用程序以严重的百分比显示电池消耗,但它真的会消耗更多电池,还是只是“纠正”报告? )

现在等待 2 秒的方法应该是什么?我应该继续使用 AlarmManager 和垃圾收集...还是应该做类似的事情:

try {
    Thread.sleep(2000);
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}

synchronized (this) {
    try {
        wait(2000);
    } catch (Exception e) {}
}

最佳答案

让我们设置关于哪些电池资源用于 REST 抓取的基本期望。

  1. Battery cost to boot up the Radio chip - 这是一个巨大的功率峰值
  2. Battery cost to keep the transfer the data - 这是一个长期成本 基于传输数据所花费的时间。

出于这两个原因,还有很多其他建议来处理您的实现。

首先推荐给avoid doing polling赞成Google Cloud Messaging .这允许服务器仅在更新发生时将信息推送到客户端。这将显着降低电池成本。

其次,如果您不能使用 GCM(例如,您无法控制服务器),那么您需要尝试并优化您的提取以在更好的时间间隔内发生。

  1. 采用 back-off pattern for your frequency .如果你看到没有 数据在最近 2 次民意调查中更新,您等待的时间加倍 进行下一次投票。
  2. 安排对 occur when the radio has already been turned on by someone else 的投票.

我建议使用 GCMNetworkManager ,它会为您完成所有这些繁重的工作。它可以让您设置间隔、等待 radio 激活,甚至处理指数退避。

关于android - 在定时(等待)、wifi 和电源锁定方面,在 android 服务中进行轮询的 "right"方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31912970/

相关文章:

android - 如何编写一个php服务,定期从android上传新的sqlite数据到mysql

java - 这种观点不受约束。它只有设计时位置,因此除非添加约束,否则它将在运行时跳转到 (0,0)

javascript - Angular5 服务不发送数据?

android - Android 中的全屏服务

Java并发-离开方法后重置条件

python - 线程锁-何时真正需要?

java - 从文本字段获取整数值

java - 使用简单 XML 的 XML 反序列化错误

c# - 如何在基于 .NET 的非 GUI 应用程序中打印?

java - 同步重写方法: Intrinsic Locks acquiring order for parent and child classes