2010-05-25 5 views
6

Je commence tout juste sur android et mon java est très rouillé. Je ne me souviens pas d'avoir déjà vu une fonction imbriquée dans une autre fonction comme celle-ci auparavant. Est-ce que quelqu'un pourrait m'expliquer exactement ce que fait la version finale et expliquer pourquoi vous imbriqueriez une fonction dans une autre comme celle-ci?Quelqu'un peut-il expliquer ce code 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); 
      } 
     } 
    }; 

Répondre

27
  • C'est un Anonymous Class. Ce qui se passe réellement est qu'une sous-classe de Handler est créée avec une fonction handleMessage surchargée.

    L'une des choses sur classes anonymes les plus élégantes est qu'ils permettent vous de définir une classe one-shot exactement où il est nécessaire. En outre, les classes anonymes ont une syntaxe succincte qui réduit l'encombrement dans votre code .

  • Vous avez également demandé "Quelqu'un pourrait-il expliquer me exactement ce que final fait." Une bonne explication can be found here.

    Dans le cas de votre exemple l'arrêt de mot-clé final personne d'être en mesure d'attribuer une nouvelle instance/null l'instance du « gestionnaire » variables qui signifie que je ne peux pas écrire la ligne handler = null; ou handler = new Handler() { ... } après votre exemple extrait de code.

+0

des thats grands gars, très apprécié – dubbeat

3

Ceci est connu comme une classe anonyme. Une explication détaillée disponible ici .... (link)

2

Ce code crée une instance de class Handler, et en même temps remplace la méthode "handleMessage" de Handler.

2

Ceci est une classe anonyme qui (a) implémente l'interface Handler ou (b) étend la classe Handler.

8

Il semble que j'ai écrit ce code Java;). C'est à partir d'un de mes exemples dans le livre de Manning Unlocking Android - http://code.google.com/p/unlocking-android/. Alors que le but du livre n'était pas de couvrir Java en détail, et plutôt de se concentrer sur Android, je m'excuse si cela a causé de la confusion.

Les réponses ici sont sur place, c'est intentionnellement une classe interne anon car elle n'est utilisée nulle part ailleurs en dehors de ce contexte.

Une note que j'ajouterais cependant, si vous débutez avec Android, j'irais avec un livre plus récent. Les livres CommonsWare de Mark Murphy sont assez bons (http://commonsware.com/Android/) et il les garde très à jour (ou peut-être regarder Déverrouiller Android Deuxième édition, je ne suis pas impliqué avec cela, et ne l'ai pas lu donc je ne peux pas le recommander ou non Manning travaille dessus et il est disponible en tant qu'accès anticipé sur leur site).

Il peut sembler étrange pour un auteur de recommander un livre autre que le sien, mais la vérité est qu'il existe de meilleures façons de faire ce genre de choses maintenant sur les nouvelles API (qui a été écrit au niveau 1.0, et testé sur 1,5 après le fait). Ne vous méprenez pas, ce livre a encore beaucoup de valeur (dont je suis fier) ​​en termes de concepts globaux (cycle de vie, activités, intentions, etc.), mais il existe de meilleures/plus faciles/nouvelles façons d'obtenir certaines tâches spécifiques effectuées.Par exemple, jetez un coup d'œil à AsyncTask (http://android-developers.blogspot.com/2009/05/painless-threading.html) et cela vous épargnera beaucoup de problèmes de Handler/Message.

(j'aurais commenté ici, mais je ne peux pas comprendre comment faire des commentaires plutôt que de « réponse », il peut être lié à ne pas avoir assez d'un représentant?)

+0

Oui, vous avez besoin de 50 rep pour poster des commentaires (et je vois que vous venez de frapper ce seuil :)). FWIW, je pense que c'est une bonne réponse. – ZoogieZork

+0

Salut, Votre livre est génial! Je l'ai trouvé beaucoup plus facile à suivre que beaucoup d'autres livres Android. J'espère que vous ne me dérange pas de poster votre code trop! :) Im fondamentalement juste en passant par tous les exemples et en détectant tous les bits que je ne comprends pas – dubbeat

+1

Je ne me dérange pas du tout, heureux que vous l'aimez, et merci! Je pense que beaucoup de choses là-dedans sont fondamentales/fondamentales et bien sûr toujours applicables (nous avons essayé de l'écrire intentionnellement). Gardez juste à l'esprit lorsque vous l'utilisez que c'est un peu plus ancien et la plate-forme a évolué. Cela peut certainement aider à la compréhension et autres, mais pour le code de production par exemple, j'irais avec les nouvelles constructions (dans ce cas, AsyncTask). De plus, pour ne pas le maquiller ici, mais juste pour vous le faire savoir, je travaille sur un livre mis à jour. Les premières étapes, mais "Android dans la pratique" est en cours. –