IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utlisation d'un Service et interfaces


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 19
    Points
    19
    Par défaut Utlisation d'un Service et interfaces
    Bonjour à tous,
    En lisant le tuto : "Utiliser les services sous Android", je me pose la question suivante:
    1) dans quel cas est-il pertinent d'utiliser des classes internes lorsque se pose la question de la performance?
    Je me demande donc si la question de la performance entre en jeu par exemple entre l'utilisation d'une classe interne ou la déclaration d'une nouvelle classe externe.
    Pour revenir au tuto sur les services, l'auteur (Nicolas Druet) y crée deux interfaces, l'une pour le service et l'autre pour l'activité.
    Le service implémente l'interface IService et l'activité utilise ce qui me semble être une classe interne implémentant l'interface IBackgroundServiceListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    final IBackgroundServiceListener listener = new IBackgroundServiceListener() { 
        public void dataChanged(final Object data) { 
            MyActivity.this.runOnUiThread(new Runnable() { 
                public void run() { 
                    // Mise à jour de l'UI  
                } 
            }); 
        } 
    };
    2) S'agit-il bien d'une classe interne?
    Est-il équivalent de procéder comme ci-dessous : je déclare une classe interne que j'initialiserai dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class BackgroundServiceListener implements IBackgroundServiceListener{
            public void dataChanged(Object o) {
                      MyActivity.this.runOnUiThread(new Runnable(){
                             public void run(){
    					// Mise à jour de l'Ui
    				}
    			});
            }
    }

    3) Est-il pertinent que l'activité implémente directement l'interface IBackgroundServiceListener, en redéfinissant les méthodes concernées?
    Il me semble que cela dépend de ce qui se passe ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ServiceConnection connection = new ServiceConnection() { 
        public void onServiceConnected(ComponentName name, IBinder service) { 
            Log.i("BackgroundService", "Connected!"); 
            IBackgroundService service = ((BackgroundServiceBinder)service).getService(); 
            service.addListener(listener); 
        }
    }
    Donc, que se passe t'il si, au lieu de passer un IBackgroundServiceListener en listener à la méthode addListener, mon Activity implémente l'interface IBackgroundServiceListener et la méthode addListener prend en argument (IBackgroundServiceListener)MyActivity.this ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class MyActivity extends Activity implements IBackgroundServiceListener{
        ...
        public void dataChanged(Object o) {
                 MyActivity.this.runOnUiThread(new Runnable(){
                             public void run(){
    					// Mise à jour de l'Ui
    				}
    			});
        }
        ...
        ServiceConnection connection = new ServiceConnection() { 
                public void onServiceConnected(ComponentName name, IBinder service) { 
                       Log.i("BackgroundService", "Connected!");
                       IBackgroundService service = ((BackgroundServiceBinder)service).getService();
                       service.addListener((IBackgroundServiceListener)MyActivity.this); 
        }
    }
    4) Est-ce tout l'objet MonActivity.this qui est passé à la méthode addListener, ou seulement la partie de MyActivity concernant l'implémentation de l'interface IBackgroundServiceListener? Cette question me semble importante, étant donné que le listener passé en argument de addListener sera enregistré dans une ArrayList<IBackgroundServiceListener> listeners, ce qui pourrait générer de l'occupation mémoire superflue et des longueur dans la manipulation des éléments de l'ArrayList si ces derniers sont des Activity toutes entières? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void addListener(IBackgroundServiceListener listener) {  
            if(listeners == null){  
                listeners = new ArrayList<IBackgroundServiceListener>();  
            }  
            listeners.add(listener);  
    }

    Merci d'avance à tous

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    1) dans quel cas est-il pertinent d'utiliser des classes internes lorsque se pose la question de la performance?
    Je me demande donc si la question de la performance entre en jeu par exemple entre l'utilisation d'une classe interne ou la déclaration d'une nouvelle classe externe.
    Qu'entends tu par classe interne et classe externe ?

    Car le listener n'est en rien une classe dans cet exemple juste une instance.

    Le fait de l'avoir interne ou externe je changera pas à mon avis grand chose à tes performances, pour en être sûr il faudrait regarder dans le compilateur comment sont gérer les espaces mémoire.
    Mais bon le fait de le déclarer à l'intérieur de la classe , te permet de savoir qu'elle est utilisé par cette classe.


    2) S'agit-il bien d'une classe interne?
    Est-il équivalent de procéder comme ci-dessous : je déclare une classe interne que j'initialiserai dans le code.
    Tu peux le faire comme cela, mais c'est plus pratique via la première méthode non ? A moins que tu veuilles utiliser ce listener pour plusieurs classe ?

    Donc, que se passe t'il si, au lieu de passer un IBackgroundServiceListener en listener à la méthode addListener, mon Activity implémente l'interface IBackgroundServiceListener et la méthode addListener prend en argument (IBackgroundServiceListener)MyActivity.this ?
    Déjà un souci dans l'exemple tu as deux variable qui s'appelle service.
    Après cela devrait marcher tu n'es pas obligé normalement de caster ton MyActivity.this en IBackgroundServiceListener.
    Cela devrait te permettre d'appeler le listener de ton activity à partir de ton service.


    4) Est-ce tout l'objet MonActivity.this qui est passé à la méthode addListener, ou seulement la partie de MyActivity concernant l'implémentation de l'interface IBackgroundServiceListener? Cette question me semble importante, étant donné que le listener passé en argument de addListener sera enregistré dans une ArrayList<IBackgroundServiceListener> listeners, ce qui pourrait générer de l'occupation mémoire superflue et des longueur dans la manipulation des éléments de l'ArrayList si ces derniers sont des Activity toutes entières? :
    Normalement il me semble que seul le IBackgroundServiceListener de ton Activity sera passer à ton listener, puisque c'est l'objet qu'il entend.

    Donc pas de souci de mémoire , le seul hic et que tu auras de grand saut entre tes objets de ta liste, mais cela n'influera pas énormément sur les performances de rapidité.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Merci bcp pour ton attention

    Qu'entends tu par classe interne et classe externe ?
    Une classe externe = une classe normale; une classe interne = une classe déclarée dans une autre classe?
    J'ai en effet fait une confusion entre l'instanciation d'une interface en redéfinissant ses méthodes à la volée, et l'utilisation d'une classe interne comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Activity extends Activity{
       private MaClasseInterne mac
       onCreate(){ blablabla}
       public class MaClasseInterne{}
    }
    Normalement il me semble que seul le IBackgroundServiceListener de ton Activity sera passé à ton listener, puisque c'est l'objet qu'il entend.
    Donc pas de souci de mémoire , le seul hic est que tu auras de grands sauts entre tes objets de ta liste, mais cela n'influera pas énormément sur les performances de rapidité.
    Merci, je n'ai pas compris les "grands sauts", mais ça me permet de continuer avec mon activity (la raison c'est que je m'y retrouve mieux dans mon code - et je garde l'utilisation de la classe interne pour plus tard, oui je veux réutiliser mon listener

    Merci bcp!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Service et interface graphique
    Par link_915 dans le forum Services Windows
    Réponses: 2
    Dernier message: 05/09/2017, 15h16
  2. RIA Services et Interface
    Par lutecefalco dans le forum Silverlight
    Réponses: 6
    Dernier message: 22/03/2011, 23h53
  3. 'Deploy' web service via interface Tomcat
    Par drakss dans le forum Services Web
    Réponses: 0
    Dernier message: 02/06/2010, 14h46
  4. [RMI] Service sans interface Remote
    Par damien77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2009, 23h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo