我正在实现推送通知,但在调用getToken时收到TIMEOUT异常。
此问题仅在某些设备上发生,如SC-03D(4.0)。
这是我用来注册令牌的IntentService:
public class RegistrationIntentService extends IntentService {
private static final String TAG = "GCM";
public static final String TOKEN_ID = "registration_id";
/**
* Constructor
*/
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
// In the (unlikely) event that multiple refresh operations occur simultaneously, ensure that they are processed sequentially.
synchronized (TAG) {
// Initially this call goes out to the network to retrieve the token, subsequent calls are local.
InstanceID instanceID = InstanceID.getInstance(this);
String gcm_sender_id = getString(R.string.gcm_sender_id);
String token = instanceID.getToken(gcm_sender_id, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
String storageToken = PrefsHelper.getTokenId(this);
Log.d(TAG, "GCM Registration Token: " + token);
}
} catch (Exception e) {
Log.d(TAG, "Failed to complete token refresh", e);
}
}
答案 0 :(得分:4)
您需要尝试使用指数后退注册令牌
以下代码可能对您有所帮助
public class RegistrationIntentService extends IntentService {
private static final String TAG = "GCM";
public static final String TOKEN_ID = "registration_id";
private final static int MAX_ATTEMPTS = 5;
private final static int BACKOFF_MILLI_SECONDS = 2000;
/**
* Constructor
*/
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
// In the (unlikely) event that multiple refresh operations occur simultaneously, ensure that they are processed sequentially.
synchronized (TAG) {
Random random = new Random();
String token = null;
InstanceID instanceID = InstanceID.getInstance(this);
long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
for (int i = 1; i <= MAX_ATTEMPTS; i++) {
try {
token = instanceID.getToken(getString(R.string.gcm_sender_id);, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
if(null != token && !token.isEmpty()) {
break;
}
} catch (IOException e) {
//Log exception
}
if (i == MAX_ATTEMPTS) {
break;
}
try {
Thread.sleep(backoff);
} catch (InterruptedException e1) {
break;
}
// increase backoff exponentially
backoff *= 2;
}
// further processing for token goes here
}
}
了解更多信息see this
答案 1 :(得分:1)
以前的解决方案几乎是正确的;如果你确实得到了令牌,那么缺少的部分实际上是在打破重试:
for (int i = 1; i <= MAX_ATTEMPTS; i++) {
try{
_token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
if (!(_token == null || _token.isEmpty())) {
break;
}
}
catch (IOException e){
Log.d(TAG, "Couldn't get token; waiting "+String.valueOf(backoff) + "ms");
if (i == MAX_ATTEMPTS) {
break;
}
try {
Thread.sleep(backoff);
}
catch (InterruptedException e1) {
break;
}
}
backoff *= 2;
}
if(_token == null){
//Couldn't get the token!!!
}