2013-10-07 3 views
0

Я пытаюсь установить идентификатор отправителя проекта динамически, извлекая его с сервера, но он выдает исключение из-за неправильного идентификатора отправителя. Я собираю идентификатор отправителя с сервера в базовом классе Application, чтобы убедиться, что я его до запуска приложения, и я также переопределил метод getSenderIds() в GCMIntentService.Динамическая настройка SENDER_ID в GCM

public GCMIntentService() { 
     super(); 
    } 

    @Override 
    protected String[] getSenderIds(Context context) { 
     String[] ids = new String[1]; 
     ids[0] = SENDER_ID; 
     return ids; 
    } 

Но я получаю исключение исключительного идентификатора отправителя. Я был бы очень признателен, если бы кто-нибудь мог дать мне обоснованное мнение о том, как установить идентификатор отправителя с помощью динамического с сервера.

+0

Когда вы получаете это исключение? Из того, что я вижу в коде GCMBaseIntentService, метод getSenderIds используется только при повторной попытке зарегистрироваться в GCM после сбоя. Это не влияет на код, в котором вы первоначально регистрировались в GCM. Используете ли вы одинаковый идентификатор отправителя в обоих местах? – Eran

+0

Да, я использую один и тот же идентификатор где угодно. Конструктор GCMIntentService использует идентификатор отправителя. Thats где исключение бросается. Я использую пустой конструктор super(), потому что в java-документе говорится, что вы должны использовать его для динамических идентификаторов. –

ответ

1

Хорошо, мне удалось это сделать сам. Я попытаюсь это объяснить. Итак, во-первых, я отредактирован() метод, как это в getSenderIds:

 @Override 
    protected String[] getSenderIds(Context context) { 

      updateSenderIdTask(context); 
      String[] ids = new String[1]; 
      ids[0] = getSenderId(context); 
      return ids; 
    } 

Ранее я установил идентификаторы [0] к переменной SENDER_ID, что я бы установить внутри метода updateSenderIdTask. Недействительное исключение идентификатора отправителя было выбрано потому, что GCM будет обращаться к переменной SENDER_ID до того, как метод updateSenderIdTask будет выполнен, даже если я назвал его внутри базового класса приложения. Итак, я вызвал updateSenderTask внутри метода getSenderIds overrided, чтобы убедиться, что я получаю идентификатор от сервера до того, как GCM использует его. Чтобы дважды проверить его, я устанавливаю идентификаторы [0] локальному методу getSenderId. Вот реализация для этого:

static String getSenderId(Context context) { 

      CustomSharedPrefs prefs = CustomSharedPrefs.getInstance(context); 
      if (prefs.getString(Constants.SENDER_ID).equals("0") 
        || prefs.getString(Constants.SENDER_ID) == null) { 
       updateSenderIdTask(context); 
      } 
      Log.e("returned sender_id", prefs.getString(Constants.SENDER_ID)); 
      return prefs.getString(Constants.SENDER_ID); 

} 

Метод updateSenderIdTask извлекает идентификатор из сервера и сохраняет его в общем переменных предпочтениях.

Смежные вопросы