2011-03-14 4 views
4

Actuellement, j'utilise Handlers pour appeler les méthodes de service Web pour le faire fonctionner en arrière-plan. Le problème est qu'il prend plus de temps pour donner la réponse, il semble être plus cher en termes de performance. Maintenant, je prévois d'aller pour les appels asynchrones, qui sera le meilleur? Quelles sont les différences entre les gestionnaires et les appels asynchrones dans Android? S'il vous plaît, aidez-moi à trouver la meilleure solution.Handlers vs appels asynchrones dans Android

Pour votre référence je donne quelques extraits de code ici

signIn.setBackgroundResource(R.drawable.signin_press); 
changeImage=new Runnable(){ 
    public void run(){         
      signIn(); 
     } 
    };  
signinHandler.post(changeImage); 

En cliquant sur le bouton Connexion J'appelle cette méthode, il ressemble à l'interface utilisateur est pendu pendant quelques minutes avant d'appeler la méthode. Dans cette méthode, deux appels de services Web coûteux sont impliqués pour authentifier et enregistrer l'utilisateur. Comment je peux normaliser la lenteur de l'application. Aidez moi.

Répondre

3

Il y a certains avantages à utiliser Thread et Handler respectivement à l'aide AsyncTask cela dépend vraiment de votre utilisation et le profilage de ces avantages contre détriments viendra probablement vers le bas pour vous.

Je recommanderais l'article Painless Threading pour un peu de compréhension du filetage sur Android.

EDIT pour plus d'informations en question.

Si nous adaptons le code de l'article Painless Threading qui a été lié, vous pouvez obtenir quelque chose comme ça.

new Thread(new Runnable() { 
    public void run() { 
     signIn(); 
     signinHandler.post(new Runnable() { 
     public void run() { 
      //TODO: Something to notify of login complete/continue processing. 
     } 
     }); 
    } 
    }).start(); 

Au TODO vous devez continuer ou notifier l'exécution, je ne sais pas ce qui est actuellement traité dans signIn() si qui traverse le fil de l'interface utilisateur, il devra être refondus. AsyncTask utilise un pool de threads et des gestionnaires en interne.

+0

Quels sont ces "certains avantages?" AsyncTask utilise des threads et des gestionnaires en interne. –

+0

@Yoni Samlan Je pense que les principaux avantages sont le contrôle et la facilité d'utilisation. Il peut y avoir des cas où 'AsyncTask' semble trop lourd pour une tâche simple et un' Runnable' peut être plus facile à gérer et également pour un autre scénario. Je n'essayais pas d'insinuer que l'utilisation de l'un d'eux ferait ralentir ou accélérer considérablement votre exécution. –

+0

Merci pour la réponse, j'ai édité mon poste avec un extrait de code pour votre référence, pour connaître mon problème. – Rajapandian

2

Ce n'est pas magique. see the source. Les performances ne seront pas meilleures que celles de vos propres gestionnaires (à l'exception du fait que l'utilisation d'un pool de threads peut faire gagner un peu de temps supplémentaire pour créer un nouveau thread, mais c'est négligeable comparé à la durée des appels de service Web typiques. quelques millisecondes ne feront certainement pas un impact perceptible par l'utilisateur). Compte tenu du nombre de facteurs impliqués dans la création d'une requête web, qu'est-ce qui vous ferait penser que les threads/gestionnaires sont ce qui ralentit votre application (par opposition à votre connexion réseau, le trafic du serveur, etc.)? Est-ce que le profilage de votre code rend cette affirmation?

+0

+1. Mettre des choses sur différents types de threads est complètement hors de propos. Dans les deux cas, (à moins d'utiliser executeOnExecutor) les tâches sont exécutées une à la fois, dans l'ordre. –

+0

Bon point, et vaut la peine d'ajouter à propos des AsyncTasks modernes. Gardez à l'esprit que cela n'est vrai que si vous ciblez la version 3.1 ou supérieure. 3.0 et inférieur, ou 3.1+ avec une application utilisant un SDK cible inférieur (la norme quand j'ai écrit cette réponse il y a deux ans!), Utilisera l'exécution parallèle (jusqu'à la taille du pool de threads) par défaut. Voir les docs. http://developer.android.com/reference/android/os/AsyncTask.html –