Android)GCM Token Timing首次发布时出现问题

时间:2015-12-09 21:02:56

标签: android google-cloud-messaging token android-progressbar

我正在开发GCM应用程序。

我的问题是,首次安装(启动)应用时,需要一些时间来获取GCM令牌。 但我的应用只是“发布”#39;服务器注册用户。

因此,首次启动时,由于在GCM令牌为空时进行注册,我的应用程序始终首次将GCM令牌注册为空。

我怎么能解决这个问题?

实际上我试图通过使用Progressbar解决这个问题,但Progressbar并没有像谷歌提供的GCM示例项目那样显示。

你们怎么解决这个问题?

2 个答案:

答案 0 :(得分:2)

您应该只在您的InstanceID.getToken调用返回后才能将令牌发送到您的应用服务器,这不应该发生在主线程上。

您应该使用将获取令牌的IntentService并将其发送到您的应用程序服务器,然后在必要时,您可以使用BroadcastReceiver / LocalBroadcastManager让您的UI知道令牌何时成功发送到应用程序服务器。

考虑GCM quickstart sample。特别要查看获取令牌并将其发送到服务器的RegistrationIntentService。

// [START get_token]
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
// [END get_token]
Log.i(TAG, "GCM Registration Token: " + token);

// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(token);

答案 1 :(得分:1)

这应该是一个非常简单的解决方案。如果您遵循googles示例,则应使用名为RegisterApp的异步任务类来注册GCM。

异步任务有3个主要方法OnPreExecute,DoInBackground和OnPostExecute。 DoInBackground是在单独的线程上运行的方法,这将是它当前失败的原因。它还没有完成运行该线程,您已经向后端发送了一个空的regID。下次登录您的应用时,这不会失败,因为如果您的应用已经注册到GCM,您很可能将regId保存到文件并阅读它

您可以在DoInBackground(您应该注册GCM的地方)或OnPostExecute中将regId发送到您的后端。

我在DoInBackground方法中直接注册后执行此操作,因为这是在单独的线程上运行的唯一部分,如果由于某种原因它无法发送到我的后端,则会在单独的线程上处理到主UIThread。

不要忘记您还需要当前的发送方法,因为如果您的应用已经注册,RegisterApp将无法运行。

希望这有帮助。

这是我遵循的样本。 Here

目前它适用于我,因为处理注册的活动被锁定为肖像而没有其他的事情发生,但每个都是他们自己的。

亚瑟提出了一些有效的观点