【问题标题】:Android ) GCM Token Timing Issue at first launchAndroid ) 首次启动时的 GCM 令牌计时问题
【发布时间】:2015-12-09 21:02:55
【问题描述】:

我正在开发 GCM 应用程序。

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

所以在第一次启动时,由于注册时 GCM 令牌为空,我的应用程序总是在第一次注册 GCM 令牌。

我该如何解决这个问题?

其实我尝试使用 Progressbar 来解决这个问题,但是 Progressbar 显示的不像 google 提供的 GCM 示例项目。

你们是怎么解决这个问题的?

【问题讨论】:

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


    【解决方案1】:

    您应该只在您的 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);
    

    【讨论】:

    • mmmm 我刚刚查看了您提供的示例,我使用的示例告诉我在异步任务的 DoInBackground 中执行 sendRegistrationToServer。我喜欢这种方式,但更有意义
    • 您在哪里看到该指令可以链接?
    • 我会再找找的
    • 啊不需要,无论哪种方式,您都可以使用 AsyncTask 发送它,但不建议这样做,IntentService 更安全:)
    【解决方案2】:

    这应该很容易解决。如果您遵循 google 的示例,则应使用名为 RegisterApp 的异步任务类完成对 GCM 的注册。

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

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

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

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

    希望这会有所帮助。

    这是我遵循的示例。 Here

    目前它对我有用,因为处理注册的活动被锁定为纵向并且没有太多其他事情发生,但每个人都有自己的事情。

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

    【讨论】:

    • 使用 AsyncTask 进行网络调用不是一个好主意,请使用 IntentService 之类的东西。
    • 嗨亚瑟,你现在让我很担心,这样做有什么危险
    • AsyncTask 用于 FAST 后台任务,网络不被认为是快速的。它有可能泄漏活动,例如,如果用户在执行 AsyncTask 期间旋转屏幕,请参阅这篇 Alex Lockwood 帖子,了解使用 AsyncTask 时可能遇到的一些陷阱。 androiddesignpatterns.com/2013/04/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多