Ответ 1
Я также проследил одно и то же исключение в новой библиотеке GCM. На самом деле у старой библиотеки Android C2DM есть такая же ошибка, такая же ошибка, и Google еще не исправил ее. Как я вижу по нашей статистике, около 0,1% пользователей испытывают этот крах.
Мои исследования показывают, что проблема заключается в некорректном выпуске сети WakeLock
в библиотеке GCM, когда библиотека пытается освободить WakeLock
, которая ничего не держит (внутренний счетчик блокировки становится отрицательным).
Я был доволен простым решением - просто поймайте это исключение и ничего не сделайте, потому что нам не нужно делать какую-либо дополнительную работу, тогда наш wakelock ничего не держит.
Для этого вам нужно импортировать источники библиотеки GCM в свой проект, а не уже скомпилированный файл .jar
. Источники библиотеки GCM можно найти в папке "$ Android_SDK_Home $/extras/google/gcm/gcm-client/src" (сначала вам нужно загрузить ее с помощью Android SDK Manager).
Далее откройте класс GCMBaseIntentService
, найдите строку
sWakeLock.release();
и объедините его с помощью try-catch.
Он должен выглядеть так:
synchronized (LOCK) {
// sanity check for null as this is a public method
if (sWakeLock != null) {
Log.v(TAG, "Releasing wakelock");
try {
sWakeLock.release();
} catch (Throwable th) {
// ignoring this exception, probably wakeLock was already released
}
} else {
// should never happen during normal workflow
Log.e(TAG, "Wakelock reference is null");
}
}
UPDATE:
Альтернативно, как было предложено @fasti в его ответе, вы можете использовать метод mWakeLock.isHeld()
, чтобы проверить, действительно ли wakelock держит эту блокировку.