2012-09-16 5 views
0

Je transfère certaines de mes applications Windows Phone 7 vers Android. Lorsque nous appelons des services dans le monde WP7, les appels sont asynchrones. Nous appelons le service et il y a un événement delegate _completed qui se déclenche quand le résultat est renvoyé. En attendant, nous continuons notre chemin.Comment appeler des services reposants dans Android

Le code Java java ci-dessous est la façon dont j'appelle un service HTTP sur mon serveur cloud. J'ai développé ce code en passant par des tutoriels Android qui enseignent comment appeler un service dans le monde android. Apparemment, les appels de service ici sont synchrones, donc l'instruction commençant par InputStream in ... n'est pas exécutée tant que le résultat n'est pas retourné.

Est-ce la façon dont il est censé fonctionner pour Android? Si le service ne répond pas, il y a une attente de quelques minutes et une exception de délai d'attente a lieu. Ce n'est pas bon. Tout va se bloquer.

Quelle est la manière recommandée d'appeler des services dans android? Merci, Gary

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    HttpURLConnection urlConnection = null; 

     try 
     { 
      URL url = new URL("http://www.deanblakely.com/REST/api/products"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream());  
      String myString = readStream(in); 
      String otherString = myString; 
      otherString = otherString + " "; 
     } 
     catch (MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     finally 
     {  
      urlConnection.disconnect(); 
     } 
}  

Répondre

2

Est-ce la façon dont il est censé travailler pour Android?

Oui. Effectuez des opérations HTTP dans un thread d'arrière-plan, tel que celui fourni par un AsyncTask.

Si le service ne répond pas, il y a une attente de quelques minutes, puis une exception de délai d'attente a lieu. Ce n'est pas bon. Tout va se bloquer.

Vous pouvez définir un délai d'expiration de socket inférieur à "quelques minutes". Par exemple, vous pouvez appeler setReadTimeout() sur votre HttpURLConnection pour spécifier un délai d'attente en millisecondes.

+0

Je suis au courant de votre chapitre sur "Traiter avec des sujets". Je voulais juste m'assurer qu'il n'y avait pas quelque chose de spécialement construit dans l'API pour les appels de service dont je n'étais pas au courant (comme il y en a en C#). Merci. –

+0

@ user1058647: Pas spécifiquement pour la mise en réseau. D'une manière générale, Android n'a pas beaucoup changé de réseau, en s'appuyant sur des éléments Java existants, dont la plupart ont adopté l'approche du bloc-arrière-plan. Il existe d'autres facettes de l'API Android qui utilisent le modèle async-operation-with-listener (par exemple, «MediaPlayer»). Et il peut y avoir des bibliothèques tierces qui vous donnent le modèle async-operation-with-listener pour les réseaux Java que vous pouvez utiliser sur Android, bien que je ne me souvienne pas du tout de ma tête. – CommonsWare

+0

N'utilisez jamais AsynTask pour effectuer une requête réseau ou tout ce qui doit être conservé. Les tâches asynchrones sont fortement liées à votre activité et si l'utilisateur change l'orientation de l'écran depuis la création de l'application, la tâche asynchrone sera arrêtée. Je vous suggère d'utiliser le modèle de service avec Intent Service et ResultReceiver. Jetez un coup d'oeil à [RESTDroid] (https://github.com/PCreations/RESTDroid). C'est une bibliothèque qui vous permet d'effectuer n'importe quel type de requête REST de manière asynchrone et de notifier votre interface utilisateur avec les auditeurs de requêtes implémentant le modèle de service de Virgil Dobjanschi. – Pcriulan

Questions connexes