Android ) 首次启动时的 GCM 令牌时间问题
Android ) GCM Token Timing Issue at first launch
我正在开发 GCM 应用程序。
我的问题是,当第一次安装(启动)应用程序时,需要一些时间来获取 GCM 令牌。
但是我的应用只是 'POST' 到服务器注册用户。
所以在第一次启动时,由于在 GCM 令牌为空时注册,我的应用程序总是在第一次注册 GCM 令牌为空。
我该如何解决这个问题?
其实我试过用Progressbar来解决这个问题,但是Progressbar没有像google提供的GCM示例项目那样显示。
你们是怎么解决这个问题的?
这应该很容易修复。如果你按照谷歌的例子,那么注册到 GCM 应该使用一个名为 RegisterApp 的异步任务 class 来完成。
异步任务有3个主要方法OnPreExecute、DoInBackground和OnPostExecute。 DoInBackground 是 运行s 在单独线程上的方法,这就是它当前失败的原因。该线程尚未完成 运行ning,您已经向后端发送了一个空的 regID。下次您登录到您的应用程序时,这不会失败,因为如果您的应用程序已经注册到 GCM
,您很可能会将 regId 保存到一个文件中并读取它
您可以在 DoInBackground 或 OnPostExecute 中将 regId 发送到后端。
我在注册后直接在 DoInBackground 方法中执行此操作,因为这是 运行 在单独线程上的唯一部分,如果由于某种原因它无法发送到我的后端,它将在主 UIThread 的单独线程。
别忘了您还需要使用当前的发送方法,因为如果您的应用已经注册,RegisterApp 不会 运行。
希望对您有所帮助。
这是我遵循的样本。 Here
目前它对我有用,因为处理注册的 activity 被锁定为肖像,没有太多其他事情发生,但每个人都有自己的。
亚瑟提出了一些有效的观点
您应该仅在您的 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);
我正在开发 GCM 应用程序。
我的问题是,当第一次安装(启动)应用程序时,需要一些时间来获取 GCM 令牌。 但是我的应用只是 'POST' 到服务器注册用户。
所以在第一次启动时,由于在 GCM 令牌为空时注册,我的应用程序总是在第一次注册 GCM 令牌为空。
我该如何解决这个问题?
其实我试过用Progressbar来解决这个问题,但是Progressbar没有像google提供的GCM示例项目那样显示。
你们是怎么解决这个问题的?
这应该很容易修复。如果你按照谷歌的例子,那么注册到 GCM 应该使用一个名为 RegisterApp 的异步任务 class 来完成。
异步任务有3个主要方法OnPreExecute、DoInBackground和OnPostExecute。 DoInBackground 是 运行s 在单独线程上的方法,这就是它当前失败的原因。该线程尚未完成 运行ning,您已经向后端发送了一个空的 regID。下次您登录到您的应用程序时,这不会失败,因为如果您的应用程序已经注册到 GCM
,您很可能会将 regId 保存到一个文件中并读取它您可以在 DoInBackground 或 OnPostExecute 中将 regId 发送到后端。
我在注册后直接在 DoInBackground 方法中执行此操作,因为这是 运行 在单独线程上的唯一部分,如果由于某种原因它无法发送到我的后端,它将在主 UIThread 的单独线程。
别忘了您还需要使用当前的发送方法,因为如果您的应用已经注册,RegisterApp 不会 运行。
希望对您有所帮助。
这是我遵循的样本。 Here
目前它对我有用,因为处理注册的 activity 被锁定为肖像,没有太多其他事情发生,但每个人都有自己的。
亚瑟提出了一些有效的观点
您应该仅在您的 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);