7
votes

Garder les choses décentralisées android

Cela pourrait ne pas avoir beaucoup de sens en termes de SDK Android, mais, en C ++, je suis utilisé pour garder mon rôle principal.cpp (et spécifiquement la fonction principale) comme un lieu où je déclare et initialise d'autres classes / objets, et Ensuite, toutes les choses que mon application a lieu dans ces classes. Je ne reviens jamais et je ne vérifie rien dans Main.cpp en après. Mais dans Java, Android SDK, vous devez remplacer des dizaines de méthodes dans l'activité principale et tout ce qui se passe dans un seul fichier. Exemple:

J'ai un MainActivity.java et les autres fichiers.java de mon projet, où est la première classe de la classe MainActivity par défaut qui prolonge l'activité, et la même que.java contient une classe qui déclare et exécute un nouveau fil. J'initialise la même classe de la MainActivity.java et transmettez une poignée de l'activité comme paramètre: xxx

et avoir la poignée à la main-d'œuvre, je continue tout faire de ce nouveau fil créé. Lorsque je dois mettre à jour l'interface utilisateur, j'utilise RunonUthRead () pour créer et afficher une nouvelle listeView (par exemple) sur ma mise en page principale. Je veux obtenir la largeur et la hauteur de la liste de liste nouvellement créée, pour ce que je dois remplacer sur Windowfocuschanged () dans mon MainActivity.java et informer le fil de là, comme GetWidth () et GetHeight () n'aura que des valeurs lorsque ListView est effectivement affiché à l'écran. Pour moi, ce n'est pas une bonne pratique de faire de telles connexions («rappels», si vous voulez) de la mainagivité à ce fil.

Y a-t-il une façon de garder des méthodes telles que Windowowfocuschanged () dans le fil et ne touchez pas le MainActivity.java du tout?

Comme je l'ai dit, pourrait ne pas avoir de sens.


1 commentaires

+1 pour poser une question que j'avais jamais envisagée avant


4 Réponses :


4
votes

Y a-t-il une façon de garder des méthodes comme Onwindowfocuschanged () dans le fil et ne touchez pas le MainActivity.java du tout?

Onwindowfocuschanged () est une méthode de rappel. On l'appelle l'activité. Vous ne pouvez pas changer cela.

et avoir la poignée à la mainadicule, je vais tout faire de ce fil nouvellement créé.

Ce n'est généralement pas une bonne idée. Utilisation d'un fil d'arrière-plan à, dites, chargez que certaines données d'un fichier ou d'une base de données sont parfaitement raisonnables (bien que l'utilisation de chargeur ou asyncctack peut être mieux). Cependant, généralement, le fil d'antécédents ne devrait ni connaître ni se soucier de choses comme "la largeur et la hauteur de la liste réelle nouvellement créée".

Vous êtes certainement bienvenu pour migrer une certaine logique hors de l'activité et dans d'autres classes. Vous pouvez utiliser des cadres particuliers pour cela, tels que des fragments ou des vues personnalisées. Cependant, la structure de classe ne doit pas être entraînée par votre modèle de filetage. Par exemple, revenons à votre déclaration d'ouverture:

en C ++, je suis utilisé pour garder ma fonction principale.cpp (et plus particulièrement la fonction principale) comme lieu où je déclare et initialise d'autres classes / objets, et ensuite toutes les choses que ma candidature a lieu dans ces classes < / p>

Cependant, en C ++, vous ne diriez pas que vous êtes enfermé dans seulement deux classes, dont l'une fonctionne sur un fil de fond. Bien que vous puissiez avoir une classe ou des classes qui utilisent un fil d'arrière-plan (ou des threads), la force motrice de la structure de classe n'est pas «J'ai un fil de fond» mais «je veux réutiliser XYZ Logic» ou «je souhaite utiliser une hiérarchie de classe à l'appui du modèle de stratégie "ou d'une autre.


4 commentaires

Merci. Cependant, je tiens à considérer cet exemple: j'ai une vision Web qui a une interface JavaScript (pont). Lorsque l'utilisateur clique sur un certain bouton de ma page Web, le code JavaScript appelle une certaine méthode de l'interface. De cette méthode, j'ai besoin de créer et d'afficher une liste de liste sur ma mise en page. Comme WebView utilise son propre thread, je dois utiliser RunonUthRead () pour y parvenir. Et là remonte à nouveau ma question sur la manière dont je voudrais obtenir la largeur et la hauteur de la liste de liste dans la même méthode où elle est déclarée?


@astralmaster: "De cette méthode, j'ai besoin de créer et d'afficher une liste de liste sur ma mise en page" - généralement le listview existerait déjà et vous auriez besoin de le peupler sur demande. "Je dois utiliser Runonuthread () pour atteindre ce message" - ou Post () sur le webview . Ou post () sur un gestionnaire , si vous en avez un pour d'autres raisons. "Et là remonte ma question sur la manière dont je voudrais obtenir la largeur et la hauteur de la liste de la vue avec la même méthode où elle est déclarée?" - Je me concentrerais plutôt sur l'élimination de ce "besoin", car la plupart des développeurs n'ont pas "besoin" de cette information pour écrire leur UIS.


@astralmaster: Cela étant dit, il n'ya aucun moyen de "obtenir la largeur et la hauteur de la liste de liste dans la même méthode où elle est déclarée?", Comme l'interface utilisateur est basée sur le message, et crée donc la liste ne le met pas réellement sur l'écran avant de revenir au contrôle du système d'exploitation. C'est l'une des raisons pour lesquelles les développeurs essaient généralement d'éviter les scénarios où ils pensent avoir besoin de connaître la largeur et la hauteur des widgets, de mettre à la place des règles de dimensionnement dans les ressources XML de mise en page.


C'est fondamentalement ce que j'attendais. Merci encore



0
votes

Si vous souhaitez effectuer des mises à jour de l'interface utilisateur d'une autre classe, envisagez d'utiliser un AsynccTask La transmission des vues dont vous avez besoin pour mettre à jour. Faites-moi savoir si vous avez besoin d'un exemple


0 commentaires

0
votes

Je lis tout et comprends vos déclarations, je peux voir que vous faites de la programmation depuis quelque jour mais apparemment commence à commencer par Android, j'ai déjà fait de nombreux systèmes d'intégration avant que je reçois totalement le concept d'avoir un logiciel Cela ressemble à: xxx

mais il y a une faille fondamentale sur la logique de votre question:

La programmation Android est un paradigme de programmation différent de C ++ et de l'ordinateur programmation et vous devez comprendre son paradigme spécifique au lieu de supposer ce qui est une bonne pratique d'autres paradigmes.

citation de votre part: créer et afficher une nouvelle listeView (par exemple) sur mon principal disposition. Je veux obtenir la largeur et la hauteur de la liste de liste nouvellement créée, pour ce que je dois remplacer sur Windowowfocuschanged () .

de cela, je peux voir que vous avez vraiment essayé de faire des trucs Android d'une manière qui n'est pas recommandée sur un contexte Android. Une liste de répertorie Vous pouvez facilement implémenter à partir de la mise en page XML setContentView (int) et utilisez l'activité Oncreate pour instancier tout threading (asynctackloader) pour charger les données en arrière-plan et le remettre à l'interface utilisateur.

Cela ne signifie pas que tout votre code sera largué dans un seul fichier, ce qui en fait un gâchis. Ce petit exemple que je vous ai mis peut faire avec une activité qui implémente les rappels de chargeuse, une classe distincte avec le chargeur, une classe distincte avec le travail de chargement de données, une classe distincte avec l'adaptateur de données, l'activité est juste une pièce centrale qui organise et Gérer ces classes sur le bon moment de son cycle de vie et à aucun moment, vous devez appeler OnWindowfocuschanged () et avoir toujours un code bien organisé.

En dehors de cela s'il vous plaît se référer à la réponse des logiciels comme il est généralement habilement écrit et correct.


0 commentaires

1
votes

Personnellement parlant Context L'idée prise de Android SDK semble être en désordre. Ce que vous décrivez provient de trop de responsabilité destinées à activité . C'est pourquoi vous devez suivre beaucoup de choses dans un fichier unique ( Activité S, obtention d'une instance context pour afficher la boîte de dialogue etc. .). Je ne pense pas qu'il y ait une solution parfaite, mais je recommanderais d'utiliser:

  • fragment sous-classes qui contribuent à diviser votre écran (et ainsi de logique) en parties séparées
  • Frameworks / bibliothèques 3ème Parti comme AndroidAnnotations , roboguice , Otto qui sont des outils parfaits pour éviter les spaghettis Code

0 commentaires