9

我有一项服务会产生一个下载线程,该线程有时会下载大文件。我意识到一旦手机进入睡眠状态,下载线程就会显着减慢,然后停止。

显而易见的补救措施,唤醒锁。所以我认为获取partial_wake_lock 是可以的,只是为了让cpu 处理下载。但这不起作用,同样的行为,下载速度变慢,然后在屏幕关闭时停止。

然后我尝试了一个screen_dim_wake_lock。这一次,屏幕一直亮着(变暗),下载一直全速进行,直到下载完成,唤醒锁被释放,然后手机进入睡眠状态。

我的问题是,为什么我不能像在 screen_dim_wake_lock 期间那样保持 partial_wake_lock 时保持线程运行?关于这两者之间的区别是否存在一些未记录的行为?是不是因为我没有在 UI 线程上运行?

编辑:

我添加了一个wifilock。wifi没有进入睡眠状态,但我的线程仍然死了。如果其他进程唤醒系统,下载将以正常速度继续,然后再次减速。如果我唤醒手机,它会以正常速度继续运行,而不是在屏幕熄灭时再次减速。似乎线程被系统推到了后台。我想知道我是否可以阻止这种情况。

4

2 回答 2

1

我对您的一项服务也有同样的问题,该服务不断下载大量 URL。最好的方法是像您一样使用 screen_dim_wake_lock 并将您的服务带到前台,如此所述。

以这种方式,屏幕始终处于开启状态,因此您的 WI-FI 界面也会发生同样的情况。相反,如果您让手机闲置一段时间,则屏幕将关闭,手机将进入睡眠模式,WIFI 也会在 15 分钟后关闭!

因此,另一种方法是使用 partial_wake_lock(只有 CPU 处于开启状态)并更改手机的设置,以使 WIFI 始终处于开启状态(也许这看起来像您获得的 WIFI_LOCK..):

  • 从主屏幕转到系统或设置,然后
  • 选择无线和网络
  • 选择 WI-FI 设置
  • 按菜单并选择高级
  • 按 Wi-Fi 睡眠策略并将其更改为从不

然后,即使在屏幕关闭的睡眠模式下,您的服务也能正常工作。这里唯一的问题是:

如果您暂时断开 WIFI 连接,那么 Android 可能会终止您的服务,因为它将处于非活动状态。但是如果您的手机始终以良好的稳定性连接到 WIFI 网络,那么一切都会正常工作!

于 2011-06-20T14:18:05.897 回答
0

看一下 Wifi 锁以及部分锁:

http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html

于 2012-06-11T11:25:03.097 回答