Wykreślam ten sam wyjątek w nowej bibliotece GCM. Właściwie stara biblioteka C2DM Android ma ten sam błąd, tę samą awarię, a Google jej jeszcze nie naprawiło. Jak wynika z naszych statystyk, około 0,1% użytkowników doświadcza tej awarii.
Moje badania pokazują, że problem polega na nieprawidłowym udostępnieniu sieci WakeLock
w bibliotece GCM, gdy biblioteka próbuje zwolnić wartość WakeLock
(wewnętrzny licznik blokowania staje się ujemny).
Byłem usatysfakcjonowany prostym rozwiązaniem - złap ten wyjątek i nie rób nic, ponieważ nie musimy wykonywać żadnej dodatkowej pracy, a nasz wakelock nic nie trzyma.
W tym celu należy zaimportować źródła biblioteki GCM do projektu, zamiast już skompilowanego pliku .jar
. Źródła biblioteki GCM można znaleźć w folderze "$ Android_SDK_Home $/extras/google/gcm/gcm-client/src" (najpierw pobierz go za pomocą Menedżera Android SDK).
Następny otwarty GCMBaseIntentService
klasa, znajdź linię
sWakeLock.release();
i otaczają go try-catch.
To powinno wyglądać tak:
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, jak sugeruje @fasti w his answer, można użyć mWakeLock.isHeld()
sposób sprawdzić, czy blokada wybudzenia faktycznie trzyma tę blokadę.
Czy próbowała go ..? Czy to działa dobrze po otworzeniu go z próbą catch .. – Rookie
Tak, wdrożyłem to rozwiązanie we wszystkich naszych projektach, działa idealnie (baza użytkowników ponad 2M użytkowników) – HitOdessit
ok, dzięki ..... – Rookie