Java GCMBasEventService-Wakelock引用为空

Java GCMBasEventService-Wakelock引用为空,java,android,Java,Android,我在GCM上收到此错误,有时我收到消息,但没有生成通知。有人能帮我找出问题所在吗 以下是我的代码。为了简单起见,删除了一些业务逻辑代码: GcmBroadcastReceiver: public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Explicitly speci

我在GCM上收到此错误,有时我收到消息,但没有生成通知。有人能帮我找出问题所在吗

以下是我的代码。为了简单起见,删除了一些业务逻辑代码:

GcmBroadcastReceiver:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Explicitly specify that GcmIntentService will handle the intent.
    ComponentName comp = new ComponentName(context.getPackageName(),
            GcmIntentService.class.getName());
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);
  }
}
GCMinentService:

public class GcmIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";

public GcmIntentService() {
    super(ConstantManager.SENDER_ID);
}

/**
 * Method called on device registered
 **/
@Override
protected void onRegistered(Context context, String registrationId) {
    Log.i(TAG, "Device registered: regId = " + registrationId);
}

/**
 * Method called on device un registred
 * */
@Override
protected void onUnregistered(Context context, String registrationId) {
    Log.i(TAG, "Device unregistered");
}

/**
 * Method called on Receiving a new message
 * */
@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String message = intent.getExtras().getString("message");
    String type = intent.getExtras().getString("type");
    int eventId = 0;
    generateNotification(context, message,2,eventId);

}

/**
 * Method called on receiving a deleted message
 * */
@Override
protected void onDeletedMessages(Context context, int total) {
    Log.i(TAG, "Received deleted messages notification");
    // notifies user
    generateNotification(context, "Deleted Message",0,0);
}

/**
 * Method called on Error
 * */
@Override
public void onError(Context context, String errorId) {
    Log.i(TAG, "Received error: " + errorId);
}

@Override
protected boolean onRecoverableError(Context context, String errorId) {
    // log message
    Log.i(TAG, "Received recoverable error: " + errorId);
    return super.onRecoverableError(context, errorId);
}

/**
 * Issues a notification to inform the user that server has sent a message.
 */
@SuppressWarnings("deprecation")
private static void generateNotification(Context context, String message,int type,int referId) {
    int icon = R.drawable.logo_v2;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, message, when);
    Log.i(TAG, "Generating Notification");
    String title = context.getString(R.string.app_name);
    if(GeneralManager.sessionManager.isLoggedIn())
    {
        if(type==2)
        {
            Log.i(TAG, "Type 2");
            Intent notificationIntent = new Intent(context, PendingEventDetailsActivity.class);
            SharedPreferences pref = context.getSharedPreferences(SessionManager.PREF_NAME, SessionManager.PRIVATE_MODE);
            String userId = pref.getString(SessionManager.KEY_USER_ID,null);
            // set intent so it does not start a new activity
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
            notificationIntent.putExtra("eventId", String.valueOf(referId));
            notificationIntent.putExtra("userId", userId);
            PendingIntent intent =
                    PendingIntent.getActivity(context, 0, notificationIntent, 0);
            notification.setLatestEventInfo(context, title, message, intent);
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            // Play default notification sound
            notification.defaults |= Notification.DEFAULT_SOUND;

            //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3");

            // Vibrate if vibrate is enabled
            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notificationManager.notify(0, notification);      
        }
        else
        {
            Log.i(TAG, "Other type");
            Intent notificationIntent = new Intent(context, WelcomeActivity.class);
            // set intent so it does not start a new activity
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
            notificationIntent.putExtra("notification", "true");

            PendingIntent intent =
                    PendingIntent.getActivity(context, 0, notificationIntent, 0);
            notification.setLatestEventInfo(context, title, message, intent);
            notification.flags |= Notification.FLAG_AUTO_CANCEL;

            // Play default notification sound
            notification.defaults |= Notification.DEFAULT_SOUND;

            //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3");

            // Vibrate if vibrate is enabled
            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notificationManager.notify(0, notification);      
        }
    }

   }
}

我知道这个答案已经很晚了,但希望它能帮助其他人。 这个问题可以通过两种方法解决:

方法1: 当不正确地释放WakeLock时,即当库尝试释放不包含任何内部锁计数器的WakeLock时,会遇到此问题。为避免此问题,如果WakeLock.release;上的WakeLock未激活,则可以添加以下代码对异常进行编解码:

同步锁{ //null的健全性检查,因为这是一个公共方法 如果WakeLock!=null{ Log.vTAG,释放wakelocker; 试一试{ WakeLocker.release; }可丢弃的捕获物{ //忽略此异常,可能wakeLock已被释放 } }否则{ //在正常工作流程中不应发生 Log.eTAG,WakeLock的引用为空; } }