我已经在我的应用程序中实现了C2DM,我在市场上看到了大量由C2DMBaseReceiver类中的空指针异常引起的崩溃报告。这个类来自于C2DM指南(http://code.google.com/android/c2dm/)中引用的chrometophone项目:
http://code.google.com/p/chrometophone/source/browse/trunk/android/c2dm/com/google/android/c2dm/C2DMBaseReceiver.java
npe发生在onHandleIntent()中,mWakeLock有时为null:
// From C2DMBaseReceiver.java:
@Override
public final void onHandleIntent(Intent intent) {
try {
Context context = getApplicationContext();
if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
handleRegistration(context, intent);
} else if (intent.getAction().equals(C2DM_INTENT)) {
onMessage(context, intent);
} else if (intent.getAction().equals(C2DM_RETRY)) {
C2DMessaging.register(context, senderId);
}
} finally {
// Release the power lock, so phone can get back to sleep.
// The lock is reference counted by default, so multiple
// messages are ok.
// If the onMessage() needs to spawn a thread or do something else,
// it should use it's own lock.
//
//
//
// NULL POINTER EXCEPTION REPORTS HERE
mWakeLock.release();
//
//
//
}
}修复非常简单,只需在访问mWakeLock != null之前检查它。但是我想知道是否还有其他人看过这个,是否应该用这个检查来更新文档?或者这是一个更大的问题,如果作者期望mWakeLock总是被初始化?
谢谢
我在那一行中加了一个空检查,只是稍微移动了一下错误:
java.lang.RuntimeException: WakeLock under-locked C2DM_LIB
at android.os.PowerManager$WakeLock.release(PowerManager.java:304)
at android.os.PowerManager$WakeLock.release(PowerManager.java:279)
at com.google.android.c2dm.C2DMBaseReceiver.onHandleIntent(C2DMBaseReceiver.java:122)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)还是不知道怎么解决这个问题。
发布于 2012-04-17 20:13:16
帮助开发这段代码的Murphy说,在某些情况下,即使代码完全正确,也会发生此错误。查看这个Google组线程给出了解释--要么锁不是从一开始就获得的,要么是在另一个过程中获得的。
如果您持久地得到此异常,那么您可能有一个缺陷。检查(使用诊断)以确定同一个进程是否获得了与释放该锁的进程相同的唤醒锁。
发布于 2013-09-06 16:23:18
在支持库中有一个新的类,WakefulBroadcastReceiver,它帮助解决广播者和接收者之间的唤醒锁。
新的GCM实现说明指定了它的使用:http://developer.android.com/google/gcm/client.html
https://stackoverflow.com/questions/7348038
复制相似问题