2011-01-28 22 views
43

Actualmente estoy desarrollando algunas aplicaciones de Android en un equipo y hemos utilizado 2 enfoques diferentes durante los últimos meses (uno que personalmente prefiero, y el otro que el otro desarrollador prefiere).Android: recomendaciones de AsyncTask: clase privada o clase pública?

Aunque hasta el momento los resultados son los mismos, esto me tiene preguntándome ... debemos:

  • AsyncTasks uso como clases particulares dentro de las actividades que los utilizan.
  • o uso AsyncTasks como clases públicas separadas que reciben el contexto de la actividad

son cualquiera de los approachs recomendados por Google?

¿Qué dice tu experiencia al respecto (ventajas, desventajas, problemas)?

Respuesta

35

Las clases internas son buenas para representar objetos que están destinados a ser privados o de alguna manera íntimamente vinculados a la clase adjunta. Ocasionalmente, hay razones técnicas para usar clases internas (por ejemplo, simular cierres). También redujeron la contaminación del espacio de nombres.

Una desventaja de las clases internas es que si tienen acceso a miembros privados (campos o funciones) de la clase adjunta, el compilador generará funciones de acceso a esos miembros. Los puristas del lenguaje argumentarán si esta ruptura de la encapsulación es una Buena Cosa o una Cosa Mala. Las funciones de acceso agregan un poco de sobrecarga a cada acceso (que generalmente no es un factor, pero ahí está). Otra desventaja es que hace que el archivo de origen sea más complejo y, por lo tanto, más difícil de administrar. (Ocasionalmente me picaron al editar una función en la clase interna mientras pensaba que estaba en la clase externa, y viceversa). Finalmente, las clases internas tienden a no ser reutilizables, mientras que las clases separadas a menudo se pueden parametrizar para tener múltiples usos. .

Estos pros y contras están fuera de mi cabeza. Estoy seguro de que otros tendrán pensamientos adicionales.

ACTUALIZACIÓN:

En este Google IO video la opción AsyncTask interior está marcado claramente como la opción equivocada.

+1

Después de un tiempo utilizándolos como clases públicas separadas, veo que es mucho más útil. – neteinstein

+14

@NeTeInStEiN - Para una AsyncTask, una clase interna (en comparación con una clase estática anidada) siempre es incorrecta por razones técnicas: una actividad puede ser eliminada (debido, digamos, a un cambio de configuración) sin detener AsyncTask. Si el AsyncTask fuera una clase interna, se filtraría la actividad anterior porque AsyncTask tendría una referencia (oculta) a la instancia de clase externa. Unos pocos cambios de orientación del teléfono provocarían la muerte del proceso por agotamiento de la memoria. –

7

No importa, use lo que tenga más sentido para su código. Lo importante es observar si hay una tarea asíncrona que contiene una referencia en una actividad después de que la actividad se ha destruido, ya sea implícitamente como una clase interna de la actividad, o explícitamente al recibir el objeto de actividad/contexto.

+4

Consulte [este debate] (https://groups.google.com/forum/#!starred/android-developers/vwRrcc84gy0) para encontrar una solución al problema (muy común) de AsyncTask que contiene una referencia a una actividad. –

Cuestiones relacionadas