Monodroid WebRequest приложение бомбы - PullRequest
1 голос
/ 28 сентября 2011

Я пробовал этот код в обычном приложении на 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 - это объект TextView в моем пользовательском интерфейсе.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Звук дал ответ. Это должно работать. Я просто объясню причину немного.

Из вашего кода кажется, что вы делаете HTTP-запрос в фоновом потоке. Вот почему вам нужно сделать RunOnUiThread. Это очень хороший подход.

Однако RunOnUiThread не гарантирует, что код будет немедленно выполнен в потоке пользовательского интерфейса. Он просто отправляет сообщение в цикл выполнения потока пользовательского интерфейса. И когда поток пользовательского интерфейса получает шанс, он его выполняет.

По сути, это означает, что "wresponse.close ()", вероятно, будет выполняться перед "resp = sr.ReadToEnd (). ToString ()". Поскольку ответ закрыт, любая попытка чтения из него приведет к ошибке. Но ошибка происходит в потоке пользовательского интерфейса, так как попытка чтения будет в потоке пользовательского интерфейса. Вот почему ваш блок try / catch не работает.

В коде Sound эта проблема устранена. Напомним, что этот код также намного эффективнее, поскольку фактическое чтение байтов выгружается в рабочий поток, поэтому ваш поток пользовательского интерфейса будет гораздо более отзывчивым.

1 голос
/ 28 сентября 2011

Как насчет этого?

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...