2011-09-28 7 views
1

J'ai essayé ce code dans une application C# normale et cela fonctionne très bien. En monodroïde, il bug complètement (en d'autres termes, pas même le try-catch fonctionne) quand j'essaye de lire à partir du flux (ou du flux de base) de n'importe quelle façon. S'il vous plaît aider:Application de bombes Monodroid WebRequest

try 
{ 
    WebRequest request = WebRequest.Create(string.Format("http://maps.google.com/maps/geo?q={0},{1}&output=xml&sensor=false", "35.245619","-98.276369")); 
    WebResponse wresponse = request.GetResponse(); 

    using (StreamReader sr = new StreamReader(wresponse.GetResponseStream())) 
    { 
     RunOnUiThread(() => _debug.Text = (sr.ReadToEnd()).ToString()); 
    } 
    wresponse.Close(); 
} 
catch (Exception ex) 
{ 
    RunOnUiThread(() => _debug.Text = string.Format("Exception: ", ex.Message)); 
} 

_debug est un objet TextView sur mon interface utilisateur.

Répondre

1

Que diriez-vous de cette façon?

try 
{ 
    WebRequest request = WebRequest.Create(string.Format("http://maps.google.com/maps/geo?q={0},{1}&output=xml&sensor=false", "35.245619","-98.276369")); 
    WebResponse wresponse = request.GetResponse(); 
    var resp=string.Empty; 
    using (StreamReader sr = new StreamReader(wresponse.GetResponseStream())) 
    { 
     resp=sr.ReadToEnd().ToString(); 
    } 
    wresponse.Close(); 
    RunOnUiThread(() => _debug.Text = resp); 
} 
catch (Exception ex) 
{ 
    RunOnUiThread(() => _debug.Text = string.Format("Exception: ", ex.Message)); 
} 
1

Le son a fourni la réponse. Cela devrait fonctionner. Je vais juste expliquer la raison un peu. À partir de votre code, il semble que vous faites la requête HTTP sur un thread d'arrière-plan. C'est pourquoi vous devez exécuter RunOnUiThread. C'est une très bonne approche. Toutefois, RunOnUiThread ne garantit pas que le code sera exécuté immédiatement sur le thread d'interface utilisateur. Il publie simplement un message à la boucle d'exécution du thread de l'interface utilisateur. Et quand le thread de l'interface utilisateur aura une chance, il l'exécutera. Ce qui signifie essentiellement que "wresponse.close()" sera probablement exécuté avant "resp = sr.ReadToEnd(). ToString()". Puisque la réponse est fermée, toute tentative de lecture entraînera une erreur. Mais l'erreur se produit sur le thread UI puisque la tentative de lecture sera sur le thread UI. C'est pourquoi votre bloc try/catch ne fonctionne pas.

Dans le code de son, ce problème est éliminé. En remarque, ce code est également beaucoup plus performant puisque la lecture réelle des octets est déchargée sur le thread de travail, donc votre thread d'interface utilisateur sera beaucoup plus réactif.