Monodroid WebRequest炸弹应用程序

时间:2011-09-28 11:47:33

标签: webrequest xamarin.android

我在普通的C#应用​​程序中试过这个代码,它运行正常。在monodroid中,当我尝试以任何方式从流(或基本流)读取时,它完全错误(换句话说,甚至没有try-catch工作)。请帮忙:

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是我的UI上的TextView对象。

2 个答案:

答案 0 :(得分:1)

这样怎么样?

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 :(得分:1)

声音提供了答案。这应该工作。我稍后会解释一下原因。

从您的代码中,您似乎正在后台线程上执行HTTP请求。这就是你需要做RunOnUiThread的原因。这是一个非常好的方法。

但是,RunOnUiThread不保证代码将立即在UI线程上执行。它只是将消息发布到UI线程运行循环。当UI线程有机会时,它将执行它。

这实质上意味着“wresponse.close()”可能会在“resp = sr.ReadToEnd()。ToString()”之前运行。由于响应已关闭,因此任何从中读取的尝试都将导致错误。但是错误发生在UI线程上,因为读取尝试将在UI线程上。这就是你的try / catch块不起作用的原因。

在Sound的代码中,这个问题被消除了。作为旁注,此代码的性能也要好得多,因为实际读取的字节数被卸载到工作线程,因此您的UI线程将更具响应性。