Tôi đã lần theo cùng một ngoại lệ trong Thư viện GCM mới. Trên thực tế, thư viện Android C2DM cũ có cùng lỗi, cùng một sự cố và Google chưa sửa nó. Như tôi có thể thấy bằng thống kê của chúng tôi, khoảng 0,1% người dùng gặp sự cố này.
Điều tra của tôi cho thấy rằng sự cố đang phát hành không chính xác mạng WakeLock
trong thư viện GCM, khi thư viện cố gắng giải phóng WakeLock
không giữ gì (bộ đếm khóa nội bộ trở thành âm).
Tôi hài lòng với giải pháp đơn giản - chỉ cần nắm bắt ngoại lệ này và không làm gì cả, bởi vì chúng tôi không cần phải thực hiện thêm bất kỳ công việc nào thì wakelock của chúng tôi không giữ gì cả.
Để thực hiện việc này, bạn cần nhập các nguồn thư viện GCM vào dự án của mình, thay vì tệp đã biên dịch .jar
. Bạn có thể tìm nguồn thư viện GCM trong thư mục "$ Android_SDK_Home $/extras/google/gcm/gcm-client/src" (trước tiên bạn cần phải tải xuống thư viện này bằng Trình quản lý SDK Android).
Tiếp theo mở GCMBaseIntentService
lớp, tìm dòng
sWakeLock.release();
và bao quanh nó với try-catch.
Nó sẽ giống như thế này:
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, như @fasti đề xuất trong his answer, bạn có thể sử dụng mWakeLock.isHeld()
phương pháp để kiểm tra xem wakelock thực sự giữ khóa này.
bạn đã thử nó ..? Liệu nó có chạy tốt hay không sau khi thử nó .. – Rookie
Có, tôi đã thực hiện giải pháp này trong tất cả các dự án của chúng tôi, nó hoạt động hoàn hảo (userbase hơn 2 triệu người dùng) – HitOdessit
ok, cảm ơn ..... – Rookie