2012-02-15 33 views
33

Creo que Google sugiere a los desarrolladores usar AsyncTask. Sin embargo, me gustaría saber cómo es diferente de usar 'new Thread' y luego llamar 'RunOnUiThread' en rendimiento y eficiencia de la memoria.Android: RunOnUiThread vs AsyncTask

Ejemplo para el uso de RunOnUithread:

// some code #1 
    Thread t = new Thread("Thread1") { 
     @Override 
     public void run() { 
      // some code #2 
      runOnUiThread(new Runnable() { 
       public void run() { 
        // some code #3 (that needs to be ran in UI thread) 

       } 
      }); 

     } 
    }; 
    t.start(); 

vs

AsyncTask:

onPreExecute() { 
    // some code #1 
} 

doInBackground() { 
    // some code #2 
} 

onPostExecute() { 
    // some code #3 
} 

¿Cuáles son las ventajas/desventajas?

Editar:

yo no busco respuestas como 'más fácil para ver el código', 'conveniente para los desarrolladores', etc. De hecho, estoy buscando diferencias registradas técnicos detrás de la escena.

Por ejemplo, la respuesta de Paul Nikonowicz a continuación habría sido la respuesta que quería ver. (Pero AsyncTask se comporta de la misma manera)

Respuesta

49

Cuando usa new Thread, realmente está creando un nuevo hilo cada vez que ejecuta eso. AsyncTask, sin embargo, usa un grupo estático de un máximo de 128 subprocesos y reutilizará un hilo antiguo siempre que exista. Por lo tanto, ejecutar AsyncTask 10 veces en serie solo creará un hilo que ejecute la tarea 10 veces en lugar de 10 hilos.

Esa es una de las diferencias entre muchas.

+3

gracias. Algo que quería escuchar Si conoces algunas otras diferencias, me gustaría saber. Además, ¿cómo sabía que AsyncTask tiene un grupo estático de un máximo de 128 subprocesos? – jclova

+0

Donde puedo leer más sobre esto en el sitio de Google Developer ... – aProgrammer

+1

Sí ... ¿cómo supiste que AsyncTask tiene un grupo estático de 128 hilos ...? – songyy

1

Estos son HUGELY different.

  • Primero, TODA la interacción del usuario se realiza en el hilo principal y en todos los gráficos.
  • Segundo AsyncTask está diseñado para breves impulsos de actividad dedicada, como la descarga de un archivo o la carga de algunos datos.
  • En tercer lugar porque todas las IU y las interacciones del usuario se realizan en el hilo principal, si comienza a empujar cosas a este hilo, el dispositivo parecerá retrasarse y será menos sensible a los comandos del usuario.

La única razón por la que desea ejecutar algo en el hilo de la interfaz de usuario es interactuar con los widgets. Aparte de eso, si desea hacer un procesamiento largo, use un AsyncTask.

Editar:

Se puede descargar sus datos en un hilo separado, y no tengo problemas con eso. El problema surge cuando quieres actualizar la UI. Solo, es imposible modificar la UI de un hilo secundario. En su lugar, deberá crear un controlador vinculado al subproceso de interfaz de usuario o crear un nuevo subproceso que esté destinado a ejecutarse en el subproceso de la interfaz de usuario (como en su ejemplo). Esto no solo es tedioso, sino una pérdida trágica de recursos. El AsyncTask se encarga de esto de manera simple y eficiente.

Para abordar su último punto, está en lo cierto. El AsyncTask tiene acceso al hilo principal en pre/postExecute. Sin embargo, el procesamiento (la fuente principal del desfase UI) que la tarea está realizando no lo es. Con la tarea, la interfaz de usuario solo se verá afectada en función de lo que está dibujando, en lugar de tener que esperar a que la tarea finalice su trabajo y cualquier dibujo que desee.

+1

Podría estar equivocado, pero no estoy de acuerdo con usted. - Estoy de acuerdo con su primer punto. UI thread = thread principal - También es posible implementar la descarga de un archivo con el método 'new thread()'. (A menos que me diga que hay algo más en AsyncTask) - AsyncTask's onPreExecute() & onPostExecute() también se ejecuta en UIThread (Tema principal). Entonces, si comienzas a empujar cosas hacia este hilo, el dispositivo también parecerá retrasarse y será menos sensible a los comandos de los usuarios. – jclova

+0

@jclove, consulte mi edición. – AedonEtLIRA

+0

Re "si desea hacer un procesamiento largo, use una AsyncTask". Estrictamente hablando, no el procesamiento ** largo **, solo el procesamiento ** medio ** (varios segundos). Ver http://developer.android.com/reference/android/os/AsyncTask.html. – ToolmakerSteve

3

La principal desventaja es que el uso de su propio hilo mantendrá viva su actividad cuando se llame al acabado. Android le dará tiempo a su actividad para que finalicen todos sus hilos. Esto tiene el efecto de crear una pérdida de actividad que eventualmente hará que su aplicación se ejecute muy lentamente hasta que su aplicación sea forzada a salir del usuario o del sistema operativo.

Puede verificar esto mirando su proceso en ADB.Incluso cuando la actividad finalice, igual la verás colgando de recursos.

Por lo tanto, si usa su propio hilo, asegúrese de administrarlo. O solo usa las api de Android. la decisión es tuya.

+4

Una AsyncTask también puede continuar ejecutándose después de #onDestroy si no llama a AsyncTask # cancel (boolean) en ella (que también asume que el implementador ha tenido el cuidado adecuado para manejar las interrupciones o comprobar AsyncTask # isCancelled() de manera oportuna) . – Jens

+0

oh realmente? deberías editar mi respuesta para obtener los puntos :) ¡Es bueno saberlo! Gracias. –

+0

@Jens Pensé que AsyncTask está relacionado con una actividad en la que se ejecuta, y se destruye una vez que la actividad también se destruye. –

12

Es una conveniencia, esencialmente. El marco AsyncTask trata de la administración del grupo Thread y proporciona una interfaz simple y comprensible. Es bien sabido, por aquellos que saben cómo usar AsyncTask, que la actividad de UI puede continuar en onPreExecute(), onPostExecute() y onProgressUpdate(), y que todo el "trabajo pesado" se realiza en doInBackground() donde no se puede tocar la interfaz de usuario .

Hace que sea fácil para un desarrollador tener una simple tarea en segundo plano que pueda publicar fácilmente actualizaciones en el hilo de la interfaz de usuario y devolver resultados cuando haya terminado. No es magia, es solo una conveniencia.

+0

No podría haberlo dicho mejor. –

+0

No puedo estar en desacuerdo con que haya explicado muy bien la perspectiva de la comodidad del desarrollador. Sin embargo, estoy buscando diferencias técnicas. (Por ejemplo, cuál es más rápido, usa menos memoria, etc.) – jclova

4

Según this, AsyncTask es más fácil de usar, pero tiene algunas limitaciones como las siguientes:

  • piscina Core tamaño y cola de trabajo es fija: 5 piscinas/10 elementos
    • Es fuertemente codificados y no se puede cambiar
  • prioridad de los hilos se fija a baja
  • El manejo de excepciones no está tan bien como con el apoyo Thread

También habrá otra diferencia que no he descubierto. Puede encontrar e inspeccionar full source code of AsyncTask ya que Android es de código abierto :-)

¡Diviértase con la codificación en Android!

Cuestiones relacionadas