即使我已经释放了它,仍然出现WakeLock finalized while still held错误。

20

我有一个应该在后台运行的服务。它在我的应用程序打开时启动,并在用户关闭应用程序时结束。

每当我的应用程序处于后台或屏幕关闭状态时,我仍然需要该服务运行。

我使用WakeLock实现了这一点,但由于某种原因我遇到了标题中的错误。

这很令人担忧,因为我可能会泄漏WakeLock(如果我理解正确的话)。

我可以通过重新启动我的应用程序来触发此错误。

以下是相关代码:

public class SomeService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE);

        mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG");

        if (!mWakeLock.isHeld()) mWakeLock.acquire();

        //Handle other processing

        return START_STICKY;
    }

    @Override
    public void onDestroy() {

        if (mWakeLock.isHeld()) mWakeLock.release();
        super.onDestroy();
    }

}
我感到困惑,因为在我的onDestroy()函数中释放了WakeLock。我不确定是什么触发了这个错误。

1
我也遇到了同样的问题。那么,你找到了任何解决方案吗? - Mandeep Rajpal
1
你尝试过将锁的创建移动到 onCreate() 吗? - iosdude
@iosdude 我尝试了,但是还是一样的。 - Pitel
1个回答

6

Service.onStartCommand() 可以在 Service.onDestroy() 之前被多次调用,因为它们并不代表相反的事件/状态(参见文档)。您可以获取多个锁(每次都会失去对先前获取的锁的引用),但当服务完成/应用程序关闭时,只释放最后一个锁。


但是如果我在 OnCreate() 方法中获取wakelock呢?这就是我正在做的,但仍然出现错误。 - Pitel
@Pitel,你能发一下你的代码吗?(虽然你可能需要创建一个新问题,因为它可能是相关但不同的问题) - Yoni Gross
你也遇到了完全相同的错误吗?“WakeLock finalized while still held”?WifiLock的释放是否正常?这是一个偶尔发生的问题,还是一直都会出现? - Yoni Gross
是的,一直都是这样。而且断言也通过了,所以我猜锁已经释放了。 - Pitel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接