在我的项目中,将在服务中启动另一个线程。为了避免在设备挂起时暂停此线程,我在启动此线程之前获取了WakeLock并在此线程完成后释放此WakeLock。 有时,这个API调用(WakeLock.acquire)在三星Galaxy SII LTE上花费的时间超过4分钟。
以下是我的代码: 在服务onStartCommand中,获取唤醒锁:
if (mWakeLock == null) {
final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Eca Engine");
mWakeLock.setReferenceCounted(false);
}
if (!mWakeLock.isHeld()) {
Log.d(TAG, "Before acquire");
mWakeLock.acquire();
Log.d(TAG, "After acquire");
}
......
在线程中,释放唤醒锁:
if (mWakeLock != null && mWakeLock.isHeld()) {
mWakeLock.release();
}
日志:“获取后”在“获取之前”打印超过4分钟。
测试设备信息是: 型号:Sc-03d Android版本:2.3.6 基础版本:3c03domlb9 内核版本:2.6.35.11 - 3c03domlb9 980106 se.infra@sep-53#2 内部编号:姜饼omlb9
之前有人遇到过这个问题吗?或者对我的任何建议表示赞赏。
答案 0 :(得分:0)
我已经解决了这个问题。 我向主线程发送命令让它释放唤醒锁,而不是直接在新线程中释放它。那么这个问题就再也无法重现了。
有谁理解根本原因?为什么我们不能在服务主线程中获取唤醒锁并在另一个线程中释放它,即使我们在同一个WakeLock对象上操作。