0

我正在开发一个使用 GCM 推送通知的 Android 应用程序。我有一个MainActivity尝试按照下面的onCreate()方法注册设备。

        String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) 
        {
        GCMRegistrar.register(this, "My sender id");        
        }
        else
        {
            GCMIntentService.received=true;

        }

        while(!GCMIntentService.received)
        {
            Log.i("RegisterLocation","waiting...... for registartion id");

        }

我无法在 中获取注册 ID ,但当设备注册时MainActivity,控件将OnRegistered(context,String)在类中起作用,GCMIntentService该类是 的子类。GCMBaseIntentService我也可以在日志中打印注册 ID。

@Override
protected void onRegistered(Context context, String registrationId) 
{
    received=true;
    Log.i(TAG, "Device registered: regId = " + registrationId);
}

由于 GCM 需要一些时间来注册设备,所以我编写了 while 循环来测试设备是否已注册。但那个循环是一个无限循环。我也试过Thread.sleep()。我希望该注册 ID 存储在我的本地服务器中。
任何人都可以建议一种解决方案来获取我的注册 IDMainActivity吗?

4

2 回答 2

0

我建议你在Service课堂上做所有的操作。

收到注册 id 后调用服务GCMIntentService

我也做了同样的方法,它运行顺利..

快乐编码:)

于 2013-05-12T12:49:32.287 回答
0

我还建议您在onRegistered方法中而不是在主要活动中执行将注册 ID 存储在服务器中的所有逻辑。

您的循环不起作用的原因与Java 内存模型有关:

重要的是要注意 Thread.sleep 和 Thread.yield 都没有任何同步语义。特别是,编译器不必在调用 Thread.sleep 或 Thread.yield 之前将缓存在寄存器中的写入刷新到共享内存,编译器也不必在调用 Thread.sleep 或 Thread 之后重新加载缓存在寄存器中的值。屈服。

例如,在以下(损坏的)代码片段中,假设 this.done 是一个非易失性布尔字段:

 while (!this.done)
     Thread.sleep(1000);

编译器可以自由地读取 this.done 字段一次,并在每次执行循环时重用缓存的值。这意味着 循环永远不会终止,即使另一个线程更改了 this.done 的值

此示例中的this.done字段的行为与您的GCMIntentService.received. 如果你让它变得易变,它应该可以工作。也就是说,我不建议在您的主要活动中使用该循环。

于 2013-05-12T13:44:18.600 回答