Я реализую GCM в своем приложении для Android. Пока все хорошо, обмен сообщениями работает, но когда сообщение получено, приложение может или не может сбой с NullPointerException
. Причина этого в том, что статическая ссылка иногда бывает null
, а иногда нет, но причина, по которой это происходит, мне неизвестна.Статические объекты не всегда там, когда получено сообщение GCM
Объект, который может или не может быть нулевым является MessageController
расположен с помощью простого шаблона службы локатора, который выглядит следующим образом:
public class ControllerLocator
{
private static MessageController controller;
public static MessageController getMessageController()
{
return controller;
}
public static void provide(MessageController mc)
{
controller = mc;
}
}
Контроллер устанавливается в onCreate()
методе приложения:
@Override
public void onCreate()
{
super.onCreate();
ControllerLocator.provide(new MessageController());
}
// Later on in the program after backend authentication:
ControllerLocator.getMessageController().setCredentials(...);
обработка сообщений
ГКМ, как это:
@Override
protected void onHandleIntent(Intent intent)
{
Bundle extras = intent.getExtras();
String msgType = GoogleCloudMessaging.getInstance(this).getMessageType(intent);
if(msgType.equals(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE))
{
handleMessage(extras.getString("message"));
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void handleMessage(String msg)
{
// 'controller' may or may not be null
MessageController controller = ControllerLocator.getMessageController();
}
Теперь, фактический сценарий: все работает нормально, когда приложение работает на переднем плане. Однако, если я нажму «назад», чтобы закрыть закрытие основного действия и получено сообщение GCM, авария может произойти или не произойти.
Почему статическая ссылка удаляется? Как я могу исправить это, чтобы гарантировать, что контроллер всегда есть?
Есть ли способ сохранить ресурсы? В этом случае должна быть переделана целая цепочка аутентификации. – manabreak
Кроме того, используйте GcmListenerService вместо того, чтобы делать свое собственное бодрствующее намерение. –