Bloqueo de registro de GCM AsyncTask hasta que se produzca el tiempo de espera

Estoy intentando obtener mi ID de registro de dispositivo con GCM. Mi código para hacerlo está contenido dentro de un AsyncTask que se llama desde mi hilo principal.

Código principal

try { String deviceId = new Gcm().execute(this.activity).get(5, TimeUnit.SECONDS); Log.i("Login", "User device id returned as " + deviceId); return deviceId; } catch (Exception e) { Log.e("Login", "Exception", e); } 

Clase GCM

 public class Gcm extends AsyncTask<Activity,Void,String> { @Override protected String doInBackground(Activity... params) { Log.i("GCM", "Attempting to get device id"); Activity activity = params[0]; try { Log.i("GCM", "Getting GCM instance"); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(activity.getApplicationContext()); Log.i("GCM", "Registering with GCM"); String regId = gcm.register(PROJECT_NUMBER); Log.i("GCM", "Device registered, registration ID=" + regId); return regId; } catch (IOException e) { throw new IllegalStateException(e); } } } 

Y aquí está mi volcado de registro

 07-28 13:07:39.093 I/GCM﹕ Attempting to get device id 07-28 13:07:39.093 I/GCM﹕ Getting GCM instance 07-28 13:07:39.093 I/GCM﹕ Registering with GCM 07-28 13:07:44.103 E/Login﹕ Exception java.util.concurrent.TimeoutException at java.util.concurrent.FutureTask.get(FutureTask.java:176) at android.os.AsyncTask.get(AsyncTask.java:507) I/GCM﹕ Device registered, registration ID=XXXXXX 

Así que por alguna razón, llamar a gcm.register () está bloqueando hasta que se alcance mi excepción de tiempo de espera. ¿Alguien tiene alguna idea de por qué podría estar pasando?

La razón es porque estás ejecutando gcm con

 .get(5, TimeUnit.SECONDS); 

Esta llamada bloquea el hilo durante 5 segundos, sin embargo, debido a diferentes razones como la conexión de red inestable, el proceso de registro puede tardar más de 5 segundos. No es el mejor enfoque para hacer lo que quieres.

Echa un vistazo a este ejemplo, tomado de la demo oficial de GCM :

 private void registerInBackground() { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid; // You should send the registration ID to your server over HTTP, so it // can use GCM/HTTP or CCS to send messages to your app. sendRegistrationIdToBackend(); // For this demo: we don't need to send it because the device will send // upstream messages to a server that echo back the message using the // 'from' address in the message. // Persist the regID - no need to register again. storeRegistrationId(context, regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); // If there is an error, don't just keep trying to register. // Require the user to click a button again, or perform // exponential back-off. } return msg; } @Override protected void onPostExecute(String msg) { mDisplay.append(msg + "\n"); } }.execute(null, null, null); 

Incorporar este ejemplo y todo debe funcionar.

Usar un AsyncTask como ese no tiene sentido. AsyncTasks se utilizan para evitar el bloqueo del subproceso, pero utilizando la llamada de bloqueo get () que está bloqueando el hilo de todos modos. También puede llamar a register () directamente en ese caso.

Usted está recibiendo un tiempo de espera porque está bloqueando durante 5s, pero GCM tarda más de 5s en registrarse. Esto podría deberse a las malas condiciones de la red, ya que puede tardar un tiempo en que una solicitud de red se apague. O tal vez es sólo tomar más de 5s para obtener el registro de identificación.

  • ¿Cómo establecer el límite de los elementos coincidentes devueltos por DynamoDB utilizando Java?
  • JSONObject en JSONObject
  • Cómo utilizar appcompat-v7 con Android API 19
  • ActivityCompat.requestPermissions no muestra el diálogo
  • Error de Android aleatoriamente java.lang.NoClassDefFoundError: com.facebook.internal.Utility
  • RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
  • Android y Javadoc: @inheritDoc no funciona
  • ¿Por qué dice que "No se puede hacer referencia a una variable no final i dentro de una clase interna definida en un método diferente"?
  • Android Error Clase ref en clase pre-verificada resuelta a implementación inesperada
  • Los botones de acción no aparecen en ActionBar
  • Android WebView - Fuga de memoria de JavaScript
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.