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
- Android en las donaciones de aplicaciones
- Vista web de Android: lee las cookies
- Medición del rendimiento en Android
- Cómo convertir cadena de fecha a largo millseconds
- ¿Está bien bloquear el subproceso de la interfaz de usuario al mostrar un diálogo de alerta?
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?
- Error: "El proceso de daemon recién creado tiene un contexto diferente del esperado"
- org.xml.sax.SAXParseException: Token inesperado al analizar XML
- Utilice los módulos Dagger sin la directiva "inyecta"
- Después de la actualización de Google Play Service a la versión 13, recibí un error
- Cómo inflar una vista en expansión con una vista de relación de aspecto fija
- El dedo de desplazamiento rápido desaparece mientras se desplaza AlphabetIndexer
- Establecer Repetir días de alarma de semana en android
- Iconos de ActionBar con diferentes tamaños
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 obtengo, es el inicio de sesión de usuario o cerrar sesión en facebook sdk 4.0.1
- Cómo girar Genymotion Emulator