2012-03-13 13 views
7

Tengo un montón de botones en mi actividad, tengo las siguientes preguntas:¿Deberíamos usar clases anónimas para OnClickListeners o clases internas con nombre?

  1. Debería crear múltiples clases anónimas internas para OnClickListeners para cada botón, como a continuación:

    private View.OnClickListener mShuffleListener = new View.OnClickListener() { 
        public void onClick(View v) { 
         /// task to do 
        } 
    }; 
    
  2. O debería Voy por una clase interna con nombre y agrego una condición if para verificar qué oyente de clic se invocó.

¿Cuál es mejor para ahorrar recursos de memoria?

+1

¡Lo que más le convenga! ... Yo sugeriría ir a una clase interna con nombre, si quiere un código bien estructurado ... –

Respuesta

7

¿Cuál es genial para guardar los recursos de mem?

Hará apenas cualquier diferencia. Como máximo 1 palabra ... y eso es comparar una clase interna estática con una clase anónima (no estática). Un ahorro tan pequeño como ese no vale la penalidad de lectura/mantenimiento del código, incluso (IMO) si tiene cientos de estos botones.

+0

Tengo casi 15 botones en una actividad, si defino 15 clases anónimas tomará 15 * 8 bytes de memoria como referencia, si uso una clase interna con nombre e implemento cliklistener, ahorrará casi 14 * 8 bytes ... qué ¿decir? – AAnkit

+3

1) Solo si son 'estáticos'. Si no, no hay ahorro. 2) Probablemente sea 14 * 4 bytes. Y esa es una cantidad de memoria ridículamente pequeña de la que preocuparse. 3) Si tienes una plataforma Android de 64 bits y, por lo tanto, referencias de 8 bytes, esto es aún más ridículo. –

1

general prefiero un enfoque más sutil que hace que el código sea más fácil de leer cuando se utiliza onClick oyente

Hay una propiedad llamada onClick para casi todos los widgets en el menú de propiedades (también disponible en el xml de diseño), allí se puede escribir un nombre de método Ex xyz

Diríjase al archivo fuente de java existe, se escribe un método ex

public void xyz(View v) 
{ 
//your code goes here 
} 

y ya está .También si realmente quieres usar CLA interior Sses luego van con los anónimos si la memoria es su preocupación (cada referencia almacenada toma 8 bytes de memoria en Java si es un tipo de referencia que en este caso es).

esperanza esta helps..please pregunten si necesita más aclaraciones

+0

Supongamos que tengo 10 botones, si creo 10 clases anónimas para cada oyente, lo haré crea 10 objetos nuevos, por lo tanto, 10 * 8 bytes, pero si voy con la clase interna con nombre y comprobo los 10 botones para ver cuál se hace clic, podría guardar 9 * 8 bytes. ?? lo que dice en este – AAnkit

+0

yup es verdadero para almacenar las referencias en otra variable porque después de todo usted almacena referencias de objetos y esas referencias tienen que almacenarse en alguna parte. Pero para los objetos (10 * 8 es una suposición incorrecta) usted no puede asegúrese de la cantidad de memoria que va a tomar, ya que de nuevo puede contener otras referencias dentro de sí mismo más tipos primitivos. Un objeto puede contener otros objetos también. – Nav

1

Hay tres maneras de manejar evento. Por favor, echar un vistazo en el siguiente enlace

http://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/

Véase lo siguiente para conocer el uso de la clase anónima y clase interna

clase anónima

usar clases internas anónimas si quiere que el código no se use en ningún otro lado (esta clase se usa solo aquí y en ninguna otra parte).

clase interna

código de clase interna se puede utilizar (aunque sólo sea por la clase que lo creó, si hecho privado). Si ve una clase interna con nombre, alguien podría pensar que se usaría en varios lugares de la clase.

+0

Supongamos que tengo 10 botones, si creo 10 clases anónimas para cada oyente, creará 10 objetos nuevos, por lo tanto, 10 * 8 bytes, pero si voy con clase interna con nombre y compruebo los 10 botones para ver cuál es clickeado, podría guardar 9 * 8 bytes. ?? lo que dices en este – AAnkit

+0

@Ankit En este caso, ¿por qué no utilizas la palabra clave implements? ¿Qué dices sobre esto? –

+0

@Ankit. Lee mi respuesta editada. –

1

Si todos los botones tienen una funcionalidad similar que solo difiere en un parámetro que es identificable, es mejor crear un oyente y asignarlo a todos los botones.

La ubicación del oyente depende del alcance de las variables que necesita utilizar. Si necesita usar algunas variables de método, debe crearse dentro del método, si utiliza miembros de una clase, debe crearse dentro de la clase.

Por ejemplo, si tiene diez botones que cada uno debe iniciar una actividad diferente, puede crear un mapa de puntos de vista y actividades, y en el oyente financiar la actividad apropiada para empezar:

Map<View, Class<?>> viewActivityMap = new HashMap<View, Class<?>>(); 
// fill it somewhere 

// in onCreate 
View.OnClickListener listener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Class<?> classToStart = viewActivityMap.get(v); 
     Intent intent = new Intent(YourActivity.this, classToStart); 
     startActivity(intent); 
    } 
} 

button1.setOnClickListener(listener); 
button2.setOnClickListener(listener); 
button3.setOnClickListener(listener); 

En caso de oyentes, la única razón real que veo para crear una clase interna, es si desea crear un constructor que reciba parámetros que sean diferentes de los constructores de clase/interfaz implementados.

+0

Tengo que llamar a algunos métodos para hacer clic en botones, . Estoy pensando en tener una clase con nombre interno que implemente ClickListener y tener condición if else que verifique en qué botón se hace clic. o debería ir para crear oyentes mediante la creación de clases internas de annony para cada botón. – AAnkit

+0

Si la funcionalidad es diferente, crearía oyentes separados con una implementación cada uno, si la funcionalidad es algo similar, usaría la misma. – MByD

+0

Gracias por esto, como puedo ver en la fuente de Android también están creando diferentes oyentes para diferentes botones. – AAnkit

Cuestiones relacionadas