Проследих същото изключение и в новата библиотека на GCM. Всъщност старата C2DM библиотека на Android има същата грешка, същия срив и 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();
и го заобиколете с опит-улов.
Трябва да изглежда така:
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");
}
}
АКТУАЛИЗАЦИЯ: Като алтернатива, както предложи @fasti в отговора му, можете да използвате метода mWakeLock.isHeld()
за проверка ако wakelock действително държи това заключване.
person
HitOdessit
schedule
27.08.2012