He rastreado la misma excepción en la nueva biblioteca de GCM también. En realidad, la vieja biblioteca C2DM de Android tiene el mismo error, el mismo bloqueo, y Google aún no lo ha solucionado. Como puedo ver en nuestras estadísticas, alrededor del 0.1% de los usuarios experimentan este bloqueo.
Mis investigaciones muestran que el problema está en la liberación incorrecta de la red WakeLock
en la biblioteca GCM, cuando la biblioteca intenta liberar WakeLock
que no retiene nada (el contador de bloqueo interno se vuelve negativo).
Estaba satisfecho con una solución simple: simplemente tome esta excepción y no haga nada, porque no necesitamos hacer ningún trabajo adicional, entonces nuestro wakelock no tiene nada.
Para ello, debe importar las fuentes de la biblioteca de GCM en su proyecto, en lugar del archivo compilado .jar
. Puede encontrar los orígenes de la biblioteca de GCM en la carpeta "$ Android_SDK_Home $/extras/google/gcm/gcm-client/src" (debe descargarla primero con el Administrador de Android SDK).
Siguiente abierta clase GCMBaseIntentService
, encuentra la línea
sWakeLock.release();
y lo rodean con try-catch.
Se debe tener este aspecto:
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");
}
}
ACTUALIZACIÓN: Alternativally, como se sugiere en @fasti his answer, puede utilizar mWakeLock.isHeld()
método para comprobar si wakelock la tenencia efectiva de este bloqueo.
¿Ha probado ..? Funciona bien después de rodearlo con try catch ... – Rookie
Sí, he implementado esta solución en todos nuestros proyectos, funciona perfectamente (usuarios de más de 2 millones de usuarios) – HitOdessit
ok, gracias ..... – Rookie