我已经在我的应用程序中实现了c2dm,我在市场上看到了大量由c2dmbasereceiver类中的空指针异常导致的崩溃报告。这个类来自chrometophone项目,它在c2dm指南(http://code.google.com/android/c2dm/)中引用:
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!=访问前为空。但是我想知道是否有其他人看到了,是否应该用这张支票更新文档?或者如果作者希望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)

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

最佳答案

根据帮助开发这段代码的mark murphy所说,即使您的代码完全正确,也会出现这种错误。See this Google Groups thread对于他的解释-锁不是从一开始就获得的,或者是在另一个过程中获得的。
如果持续出现此异常,则可能存在缺陷。检查(使用诊断程序)以查看获取尾迹锁的进程是否与释放尾迹锁的进程相同。

关于android - C2DMBaseReceiver类中的空指针异常报告(来自市场),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7348038/

10-11 22:20
查看更多