我在普通的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对象。
答案 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线程将更具响应性。