2012-06-25 31 views
37

En mi aplicación de Android realizo algunas operaciones en el doInBackground extendiendo la clase AsyncTask<Void, Void, Void>. (No me sirve para realizar ninguna UI en esta clase)Extendiendo AsyncTask <Void, Void, Void>

  1. ¿Este uso correcto de AsyncTask?
  2. En caso afirmativo, ¿puedo extender AsyncTask?
  3. ¿Cuál es la diferencia entre extender AsyncTask y AsyncTask<Void, Void, Void>

código de ejemplo:

public class MessagePooling extends AsyncTask<Void, Void, Void> 
{   
    @Override 
    protected Void doInBackground(Void... params) 
    { 
     while (!isCancelled()) 
     {   
      //Getting data from server    
      SystemClock.sleep(1000); 
     } 
     return null; 
    } 
} 

O:

public class MessagePooling extends AsyncTask 
{ 
    @Override 
    protected Object doInBackground(Object... params) 
    { 
     while (!isCancelled()) 
     {   
      //Getting data from server    
      SystemClock.sleep(1000); 
     } 
     return null;  
    } 
} 

Gracias

+0

"¿Cuál es la diferencia entre la extensión de AsyncTask y AsyncTask" <- Esa afirmación no podría ser menos clara, ¿podría ser más específico? – Devunwired

+2

lo siento, aparentemente <> no se puede mostrar. Edité la pregunta. – Rami

Respuesta

48

La clase AsyncTask se puede considerar como un mecanismo de enhebrado muy conveniente. Le brinda algunas herramientas que puede usar que simplemente los hilos de Java simples no tienen, como en operaciones de cancelación de limpieza. No tiene que hacer ninguna interfaz de usuario en segundo plano.Simplemente podría ejecutar uno escribiendo una como una clase anónima como esto:

new AsyncTask<Integer, Void, Void>(){ 
     @Override 
     protected Void doInBackground(Integer... params) { 
      // **Code** 
      return null; 
     } 
    }.execute(1, 2, 3, 4, 5); 

Se ejecutará lo que pones en doInBackground en un hilo de fondo con los parámetros dados. Del mismo modo, puede simplemente usar Void y ejecutar sin parámetros.

La única ventaja que podría pensar al ejecutar un hilo de esta manera sería ayudar en el mantenimiento futuro. Puede haber un caso en el que desee modificar ciertas cosas que deben estar en el hilo de la interfaz de usuario, en cuyo caso anularía los otros métodos. En otros casos, simplemente no haces la acción lo suficiente como para justificar la escritura de otra clase, así que simplemente crea una sobre la marcha y termina con ella.

EDIT:

Para contestar # 3: son efectivamente la misma. El objeto Void es un objeto Java como cualquier otra cosa. No está usando Void, por lo que lo que usa en su lugar no importa. Es solo que el contrato AsyncTask requiere que se pasen tres tipos de clases, y de manera predeterminada son Object, que es la clase base de todo.

+0

¿Y durante cuánto tiempo dura la vida del nuevo objeto AsyncTask, cuando el recolector de basura puede recopilarlo? – mes

+0

@mes The AsyncTask vivirá mientras se ejecuta doInBackground. Tan pronto como doInBackground finalice y se invoque aCancel o onPostExecute, el objeto quedará sujeto a la recolección de elementos no utilizados. Cuando el recolector de basura realmente elimina el objeto de la memoria depende de la JVM. – DeeV

16

(he n o su uso en la realización de cualquier interfaz de usuario en esta clase)

Entonces sólo tiene que utilizar la clase normal de Thread en lugar de utilizar AsyncTask clase que está diseñado para hacer frente a los cambios de interfaz de usuario durante el tiempo de vida de la rosca:

Runnable r = new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     // your code here 
    } 
}; 

Thread t = new Thread(r); 
t.start(); 
+2

Esto es correcto. AsyncTask es solo un hilo envolvente para facilitar la programación de tareas en segundo plano que interactúan con la interfaz de usuario. Si el OP no se ocupa de la IU, entonces tiene sentido tratar directamente con los hilos. –

+1

@Atlos intenta leer algo sobre tipos genéricos ... – Sajmon

+1

Sí, los genéricos son agradables, pero AsyncTask no es lo que Rami necesita según lo que se publicó. Si se desean genéricos, se podría implementar algo como http://stackoverflow.com/questions/1659986/java-parameterized-runnable o se podría usar AsyncTask. –

3

¿Es este uso adecuado de AsyncTask?

Usted no dijo cuál es su objetivo. Pero AsyncTask generalmente se usa para tareas largas y para actualizar la IU durante el trabajo, exactamente para notificar algún cambio en el progreso de un trabajo prolongado. También es muy eficiente, herramienta de tipo seguro y más compleja que Handler, por ejemplo.

¿Cuál es la diferencia entre extender AsyncTask y AsyncTask

AsyncTask es de tipo genérico y se debe utilizar los genéricos con ellos es un código más rápido, más de tipo seguro.

que no tienen uso en la realización de cualquier interfaz de usuario

Así que usted puede utilizar en lugar Handler o clásica Runnable interfaz y se puede trabajar sólo con subprocesos de trabajo básicamente.


Nota: En general, el uso de tipos genéricos hace que el código sea más rápido, más seguro para tipos. La siguiente ventaja es la verificación de tipos fuertes en el código fuente de compilación, restricciones de conversiones explícitas, etc.

+3

En realidad, según la documentación, AsyncTask debe usarse para tareas más cortas. Vista la sección "Descripción general de la clase" en http://developer.android.com/reference/android/os/AsyncTask.html – Mafro34