1

在我的项目中,将在服务中启动另一个线程。为避免在设备挂起时暂停此线程,我在启动此线程之前获取了 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 Build number:gingerbread omlb9

以前有人遇到过这个问题吗?或者对我的任何建议表示赞赏。

4

1 回答 1

0

我已经解决了这个问题。我向主线程发送一个命令,让它释放唤醒锁,而不是直接在新线程中释放它。那么这个问题就不能再重现了。

有人了解根本原因吗?为什么我们无法在服务主线程中获取唤醒锁并在另一个线程中释放它,即使我们在同一个 WakeLock obj 上操作。

于 2012-08-03T07:20:07.310 回答