首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C2DMBaseReceiver类中的空指针异常报告(来自市场)

C2DMBaseReceiver类中的空指针异常报告(来自市场)
EN

Stack Overflow用户
提问于 2011-09-08 12:31:22
回答 2查看 518关注 0票数 3

我已经在我的应用程序中实现了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:

代码语言:javascript
复制
// 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总是被初始化?

谢谢

我在那一行中加了一个空检查,只是稍微移动了一下错误:

代码语言:javascript
复制
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)

还是不知道怎么解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2012-04-17 20:13:16

帮助开发这段代码的Murphy说,在某些情况下,即使代码完全正确,也会发生此错误。查看这个Google组线程给出了解释--要么锁不是从一开始就获得的,要么是在另一个过程中获得的。

如果您持久地得到此异常,那么您可能有一个缺陷。检查(使用诊断)以确定同一个进程是否获得了与释放该锁的进程相同的唤醒锁。

票数 0
EN

Stack Overflow用户

发布于 2013-09-06 16:23:18

在支持库中有一个新的类,WakefulBroadcastReceiver,它帮助解决广播者和接收者之间的唤醒锁。

新的GCM实现说明指定了它的使用:http://developer.android.com/google/gcm/client.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7348038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档