2010-05-25 32 views
6

Estoy empezando en Android y mi Java está muy oxidado. No recuerdo haber visto una función anidada en otra función como esta antes. ¿Alguien podría explicarme exactamente qué es lo último y explicar por qué anidarías una función en otra como esta?¿Alguien puede explicar este código de Java

private final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(final Message msg) { 
      Log.v(Constants.LOGTAG, " " + ReviewList.CLASSTAG + " worker thread done, setup ReviewAdapter"); 
      progressDialog.dismiss(); 
      if ((reviews == null) || (reviews.size() == 0)) { 
       empty.setText("No Data"); 
      } else { 
       reviewAdapter = new ReviewAdapter(ReviewList.this, reviews); 
       setListAdapter(reviewAdapter); 
      } 
     } 
    }; 

Respuesta

27
  • Esta es una Anonymous Class. Lo que está sucediendo realmente es que una subclase de Handler está siendo creada con una función handleMessage reemplazada.

    Una de las cosas más elegantes sobre clases anónimas es que permiten definir una clase de un solo disparo exactamente donde se necesita. Además, las clases anónimas tienen una sintaxis sucinta de que reduce el desorden en su código .

  • También se le preguntó "¿Podría alguien explicarme exactamente lo final hace". Una buena explicación can be found here.

    En el caso de que su ejemplo la palabra clave final se detiene a nadie de la posibilidad de asignar una nueva instancia/nula la instancia del "controlador" variables que significa que no puedo escribir la línea handler = null; o handler = new Handler() { ... } después de su fragmento de código de ejemplo.

+0

eso chicos grandes, muy apreciadas – dubbeat

3

Esto se conoce como una clase anónima. Una explicación detallada disponible aquí ... (link)

2

Este código crea una instancia del controlador de clase, y al mismo tiempo anula el método "handleMessage" de Handler.

2

Esta es una clase anónima que (a) implementa la interfaz del Manejador o (b) extiende la clase Manejador.

8

Parece que escribí ese código Java;). Es de uno de mis ejemplos en el libro de Manning Unlocking Android - http://code.google.com/p/unlocking-android/. Si bien el objetivo del libro no era cubrir Java en detalle, y más bien centrarse en Android, me disculpo si causó confusión.

Las respuestas aquí son acertadas, eso es intencionalmente una clase interna porque no se usa en ningún otro lugar fuera de ese contexto.

Una nota que agregaría sin embargo, si recién está empezando con Android, iría con un libro más nuevo. Los libros de Mark Murphy en CommonsWare son bastante buenos (http://commonsware.com/Android/) y los mantiene muy actualizados (o tal vez en Desbloquear la segunda edición de Android, no estoy involucrado en eso, y no lo he leído, así que no puedo recomendarlo o no, pero Manning está trabajando en ello y está disponible como acceso anticipado en su sitio).

Puede parecer extraño que un autor recomiende un libro que no sea el suyo, pero la verdad es que ahora hay mejores formas de hacerlo en las nuevas API (que se escribieron en el nivel 1.0 y se probaron en 1.5 después del hecho). No me malinterpreten, ese libro todavía tiene mucho valor (que me enorgullece) en términos de conceptos generales (ciclo de vida, actividades, intenciones, etc.), pero hay formas mejores/más fáciles/más nuevas de obtener algunas tareas específicas hechas.

Por ejemplo, eche un vistazo a AsyncTask (http://android-developers.blogspot.com/2009/05/painless-threading.html) y le ahorrará mucho dolor en el Manejador/Mensaje.

(Me he comentado aquí, pero no puedo averiguar cómo hacer comentarios en lugar de "respuesta", que puede estar relacionado con no tener suficiente de un representante?)

+0

Sí, necesitas 50 representantes para publicar comentarios (y veo que acabas de alcanzar ese umbral :)). FWIW, creo que esta es una buena respuesta. – ZoogieZork

+0

Hola, ¡Tu libro es genial! Me pareció mucho más fácil de seguir que muchos de los otros libros de Android. Espero que no te importe publicar demasiado tu código! :) Básicamente solo estoy repasando todos los ejemplos y disecting todos los bits que no entiendo – dubbeat

+1

No me importa en absoluto, me alegra que te guste, ¡y gracias! Creo que muchas de las cosas allí son fundamentales/y, por supuesto, siguen siendo válidas (intentamos escribirlo de esa manera intencionalmente). Solo ten en cuenta cuando lo uses que es un poco más antiguo y que la plataforma ha evolucionado. Ciertamente puede ayudar con la comprensión y demás, pero para el código de producción, por ejemplo, iría con las construcciones más nuevas (en ese caso, AsyncTask). Además, no para proxenetismo aquí, pero solo para que lo sepa, estoy trabajando en un libro actualizado. Primeras etapas, pero "Android in Practice" está en marcha. –

Cuestiones relacionadas