2011-09-28 5 views
1

일반 C# 응용 프로그램에서이 코드를 시도했지만 정상적으로 작동합니다. monodroid에서 스트림 (또는 기본 스트림)에서 어떤 식 으로든 읽으려고하면 버그가 완전히 나옵니다 (즉, try-catch 작업조차도). 도와주세요 :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 스레드에서 발생하므로 UI ​​스레드에서 오류가 발생합니다. 그게 당신의 try/catch 블록이 작동하지 않는 이유입니다.

사운드의 코드에서이 문제는 해결되었습니다. 부수적으로, 바이트의 실제 읽기가 작업자 스레드로 오프로드되기 때문에이 코드는 훨씬 더 성능이 좋으므로 UI ​​스레드가 훨씬 더 응답하게됩니다.