2011-09-28 36 views
1

我試過這個代碼在一個正常的C#應用​​程序,它工作正常。在monodroid中,當我嘗試以任何方式從流(或基本流)讀取時,它完全錯誤(換句話說,甚至沒有嘗試捕獲工作)。請幫助: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是我的UI一個TextView對象。

回答

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

聲音提供了答案。這應該工作。我只是解釋一下原因。

從你的代碼看來,你似乎正在後臺線程上執行HTTP請求。這就是爲什麼你需要執行RunOnUiThread。這是一個非常好的方法。

但是,RunOnUiThread並不保證代碼將立即在UI線程上執行。它只是向UI線程運行循環發佈消息。當UI線程有機會時,它會執行它。

這意味着「wresponse.close()」可能會在「resp = sr.ReadToEnd()。ToString()」之前運行。由於響應已關閉,因此嘗試從中讀取將導致錯誤。但錯誤發生在UI線程上,因爲讀取嘗試將在UI線程上進行。這就是爲什麼你的try/catch塊不起作用。

在Sound的代碼中,這個問題被消除了。值得一提的是,由於實際讀取的字節被卸載到工作線程,因此這段代碼的性能也會更好,因此您的UI線程將更具響應能力。