我正在开发一个Android应用程序,我在其中使用GCM进行推送通知。我有一个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");
}
我无法在MainActivity
中获取注册用户ID,但控件将转到OnRegistered(context,String)
类中的GCMIntentService
函数,该类是GCMBaseIntentService
的子类,当设备已注册。
我也可以在日志中打印注册ID。
@Override
protected void onRegistered(Context context, String registrationId)
{
received=true;
Log.i(TAG, "Device registered: regId = " + registrationId);
}
由于GCM需要一些时间来注册设备,我写了一个循环来测试设备是否已注册。但那个循环是一个无限循环。我也试过了Thread.sleep()
。我希望该注册ID存储在我的本地服务器中
任何人都可以提出一个解决方案来获取MainActivity
中的注册ID吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
我还建议您使用onRegistered
方法在服务器中存储注册ID的所有逻辑,而不是主要活动。
你的循环不起作用的原因与Java memory model:
有关重要的是要注意Thread.sleep和Thread.yield都没有 有任何同步语义。特别是编译器 不必将寄存器中缓存的写入刷新到共享内存 在调用Thread.sleep或Thread.yield之前,编译器也没有 在调用Thread.sleep之后,必须重新加载缓存在寄存器中的值 或Thread.yield。
例如,在下面(破碎的)代码片段中,假设 this.done是一个非易失性布尔字段:
while (!this.done)
Thread.sleep(1000);
编译器可以自由阅读this.done字段一次,并重用 每次执行循环时的缓存值。这意味着 循环永远不会终止,即使另一个线程改变了 this.done的值。
此示例中的this.done
字段与GCMIntentService.received
的行为相同。如果你使它变得不稳定它应该工作。也就是说,我不建议在你的主要活动中使用那个循环。