2011-09-08 74 views
3

我在我的应用程序中实现了C2DM,我在C2DMBaseReceiver类中看到了市场上由空指针异常导致的相当数量的崩溃报告。这个类是从chrometophone项目,该项目的C2DM指南(http://code.google.com/android/c2dm/)中引用:C2DMBaseReceiver类中的空指针异常报告(来自市场)

http://code.google.com/p/chrometophone/source/browse/trunk/android/c2dm/com/google/android/c2dm/C2DMBaseReceiver.java

的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) 

仍然不知道如何解决这个问题。

回答

0

根据帮助开发此代码的Mark Murphy,即使代码完全正确,也会出现这种错误。 See this Google Groups thread为他的解释 - 或者锁并没有获得开始或被收购在一个不同的过程。

如果持续存在此异常,那么您可能有缺陷。检查(使用诊断)查看是否有相同的进程正在获取作为释放锁的唤醒锁。