Foros del Web » Programando para Internet » Android »

No me aclaro con AsyncTask

Estas en el tema de No me aclaro con AsyncTask en el foro de Android en Foros del Web. Tengo cierto lío con la clase AsyncTask. Me explico, quiero ejecutar un método que me devuelve la latitud y la longtud con AsyncTask. El método ...
  #1 (permalink)  
Antiguo 08/02/2016, 03:35
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 9 años, 11 meses
Puntos: 0
No me aclaro con AsyncTask

Tengo cierto lío con la clase AsyncTask. Me explico, quiero ejecutar un método que me devuelve la latitud y la longtud con AsyncTask. El método funciona bien, es el siguiente:
public void activarGPS(), y la clase AsynTask que tengo y me da error es:
public class GPSLocation extends AsyncTask<Void, Integer, Void> {
ProgressDialog progressDialog;
@Override
protected Void doInBackground (Void... params){
activarGPS();
return null;
}
@Override
protected void onPreExecute()
{
progressDialog = new ProgressDialog(AndroidGPSTrackingActivity.this);
progressDialog.setCancelable(true);
progressDialog.setMessage("Buscando localización GPS...");
………
protected void onProgressUpdate(Integer... progress) {
setProgress(progress[0]);
}
@Override
protected void onPostExecute(Void result)
{
progressDialog.cancel();
longi.setText(longitud);
lati.setText(latitud);
}
Por lo que he entendido en AsyncTask<Void, Integer, Void>, el primer Void corresponde a:
protected Void doInBackground (Void... params){
y es Void porque no recibe ningún parámetro para ejecutar el método: activarGPS(); lo primero que no entiendo es porqué hay que poner Void doInBackground cuando ya le hemos dicho que es de tipo Void, y segundo porque añadimos Void... params cuando no recibe parámetros.
El segundo, Integer corresponde a AsyncTask<Void, Integer, Void>.
Y el tercero, Void, como en el primer caso no recibe parámetros, cierra el Dialog, recibe la latitud y la longitud y las pone en un TextView.
Cuando ejecuto la aplicación me da error, en el log es el siguiente:
Activity com.example.gpstracking.AndroidGPSTrackingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$Decor View{4145c090 V.E..... R......D 0,0-513,144} that was originally added here
android.view.WindowLeaked: Activity com.example.gpstracking.AndroidGPSTrackingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$Decor View{4145c090 V.E..... R......D 0,0-513,144} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java :409)
at android.view.WindowManagerGlobal.addView(WindowMan agerGlobal.java:218)
at android.view.WindowManagerImpl.addView(WindowManag erImpl.java:69)
at android.app.Dialog.show(Dialog.java:281)
at com.example.gpstracking.AndroidGPSTrackingActivity $GPSLocation.onPreExecute(AndroidGPSTrackingActivi ty.java:73)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.j ava:586)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.example.gpstracking.AndroidGPSTrackingActivity .onCreate(AndroidGPSTrackingActivity.java:34)
………………..
Agradecería cualquier aporte que me pudiera dar algo de luz.
  #2 (permalink)  
Antiguo 14/02/2016, 07:33
 
Fecha de Ingreso: noviembre-2008
Mensajes: 59
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: No me aclaro con AsyncTask

Buenas jlopez.

Bien, el tema de uso de la clase Void en AsyncTask se debe a tema de genéricos de java. El propio AsyncTask define tres tipos genéricos diferentes, uno para parámetros, otro para progreso y otro para resultados. El uso de Void nos permite especificar que el método no devuelve nada, pero en cambio sí que estamos obligados por el compilador a devolver algo dentro del método (normalmente null).

De esta forma AsyncTask puede mantener su estructura sin cambiar la firma (signature) de sus métodos, ya que se permite Void que sí es una clase, pero si lo quisieramos hacer con void (el cual no es una clase, si no una palabra reservada), tendríamos que tener más tipos de AsyncTask diferentes en Android, cambiando la clase padre en base a qué método quisieramos como void.

Respecto al error, creo que el problema es que el Activity termina cuando el AsyncTask está terminando de ejecutar. Recuerda que la ejecución es asíncrona, por lo tanto el Activity que ha llamado al AsyncTask puede estar terminando o no existir cuando AsyncTask ejecuta onPostExecute. Tienes que realizar por tanto una comprobación.
  #3 (permalink)  
Antiguo 29/02/2016, 17:47
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 2 meses
Puntos: 11
Respuesta: No me aclaro con AsyncTask

Yo use AsyncTask para invocar una url y me votaba un error policy quien sabe que. El asunto es que se deben configurar politicas de como se realiza la petición y creo que tambien el control de los hilos. No recuerdo bien fue hace como dos años, pero el chiste es que lo resolvi así (acabo de buscar el proyecto):

@Override
protected void onPreExecute() {
super.onPreExecute();
/*se va a ejecutar antes de enviar a nuestro hilo secundario todo el proceso y lo podemos
utilizar para inicializar tareas como mostrar una barra de progreso*/
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().buil d();
StrictMode.setThreadPolicy(policy);

progressBar.setVisibility(View.VISIBLE);
}

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:16.