我在我的应用程序中实现了C2DM,我在C2DMBaseReceiver类中看到了市场上由空指针异常导致的相当数量的崩溃报告。这个类是从chrometophone项目,该项目的C2DM指南(http://code.google.com/android/c2dm/)中引用:C2DMBaseReceiver类中的空指针异常报告(来自市场)
的NPE发生在onHandleIntent(),mWakeLock有时为空:
// 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)
仍然不知道如何解决这个问题。