2013-10-07 67 views
0

我想通过从服务器获取来动态设置项目发件人ID,但它会引发无效的发件人ID异常。我从基础应用程序类中的服务器获取发件人ID,以确保在应用程序启动之前得到它并且我也覆盖了GCMIntentService中的getSenderIds()方法。在GCM中动态设置SENDER_ID

public GCMIntentService() { 
     super(); 
    } 

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

但我得到无效的发件人id例外。我真的很感激,如果有人可以给我一个关于如何从服务器动态设置发件人ID的知情意见。

+0

你什么时候得到这个异常?从我在GCMBaseIntentService的代码中可以看到的内容,getSenderIds方法仅在失败后重试注册到GCM时使用。它不会影响您最初注册到GCM的代码。你是否在两个地方使用相同的发件人ID? – Eran

+0

是的,我在每个地方都使用相同的ID。 GCMIntentService的构造函数使用发件人ID。这就是抛出异常的地方。我使用空的super()构造函数,因为java文档说你应该使用这个动态ID。 –

回答

1

好吧,我设法做到了我的自我。我会尽力解释它。所以,首先我编辑getSenderIds()方法是这样的:

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

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

此前我已经设定的ID [0]到,我将设置updateSenderIdTask方法内的可变SENDER_ID。由于在updateSenderIdTask方法被执行之前GCM会访问SENDER_ID变量,即使我已经在基础应用程序类中调用它,也会抛出无效的发件人ID异常。所以,我在getSenderIds覆盖方法中调用了updateSenderTask,以确保在GCM使用它之前从服务器获取id。要仔细检查它,我将ids [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方法获取从服务器并且将其存储在ID中的共享偏好变量。