Ich habe dieselbe Ausnahme in der neuen GCM-Bibliothek auch verfolgt. Eigentlich alte C2DM Android-Bibliothek haben den gleichen Fehler, der gleiche Absturz, und Google hat es noch nicht behoben. Wie ich in unseren Statistiken sehen kann, haben etwa 0,1% der Benutzer diesen Absturz erlebt.
Meine Untersuchungen zeigen, dass das Problem in der falschen Freigabe des Netzwerks WakeLock
in der GCM-Bibliothek liegt, wenn die Bibliothek versucht, WakeLock
freizugeben, die nichts enthält (interner Sperrzähler wird negativ).
Ich war mit einer einfachen Lösung zufrieden - fangen Sie einfach diese Ausnahme und nichts tun, weil wir keine zusätzliche Arbeit machen müssen, dann unsere Wakelock halten nichts.
Um dies zu tun, müssen Sie GCM-Bibliotheksquellen in Ihr Projekt importieren, anstatt bereits kompilierte .jar
Datei. Sie können die Quellen der GCM-Bibliothek unter dem Ordner "$ Android_SDK_Home $/extras/google/gcm/gcm-client/src" finden (Sie müssen sie zuerst mit dem Android SDK Manager herunterladen).
Weiter offen GCMBaseIntentService
Klasse finden Linie
sWakeLock.release();
und umgeben sie mit try-catch.
Es sollte wie folgt aussehen:
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: Alternativally, wie vorgeschlagen @fasti in his answer, Sie mWakeLock.isHeld()
Methode können Sie prüfen, ob WakeLock tatsächlich diese Sperre hält.
Haben Sie versucht, es ..? Es läuft gut nach dem Umgeben mit Versuch fangen. – Rookie
Ja, ich habe diese Lösung in allen unseren Projekten implementiert, es funktioniert perfekt (Userbase mehr als 2M Benutzer) – HitOdessit
ok, danke ..... – Rookie