2015-08-28 5 views
0

Это мой код. Я использую функцию для извлечения списка, но не отправляю его.Возврат списка обратно к функции

public List<string> country_set() 
{ 
    mCountryUrl = new Uri ("http://xxxxxxx.wwww/restservice/country"); 
    mList = new List<string>(); 
    mCountry = new List<Country>(); 
    WebClient client = new WebClient(); 
    client.DownloadDataAsync (mCountryUrl); 
    client.DownloadDataCompleted += (sender, e) => { 
     RunOnUiThread (() => { 
      string json = Encoding.UTF8.GetString (e.Result); 
      mCountry = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Country>> (json); 
      Console.WriteLine (mCountry.Count.ToString()); 
      int x = mCountry.Count; 
      for(int i=0; i< x ; i++) 
      { 
       mList.Add(mCountry[i].name); 
      } 
     }); 
    }; 
    return mList; 
} 

Он выдает исключение. Просьба помочь мне

+3

Какое исключение вы употребляете? – Chostakovitch

+3

А какая строка выбрасывает это исключение? – bkribbs

+0

Если это не шаблон дизайна Android, кажется, что вы возвращаете список из 0 элементов и отправляете поток для добавления элементов в этот список (который также не является потоковым). – Rob

ответ

1

Проблема заключается в том, что вы возвращаете mList сразу после завершения вашего метода, который до завершения вызова на веб-сервер. Теперь, после того как ваш код вызова проверяет список, чтобы найти его пустым, в конце концов вызов на сервер завершится, и ваш список будет заполнен, что слишком поздно!

Это позволит устранить проблему:

 var mCountryUrl = new Uri("http://xxxxxxx.wwww/restservice/country"); 
     var mList = new List<string>(); 
     var mCountry = new List<Country>(); 
     WebClient client = new WebClient(); 
     var data = client.DownloadData(mCountryUrl); 

     string json = Encoding.UTF8.GetString(data); 
     mCountry = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Country>>(json); 
     Console.WriteLine(mCountry.Count.ToString()); 
     int x = mCountry.Count; 
     for (int i = 0; i < x; i++) 
     { 
      mList.Add(mCountry[i].name); 

     } 

     return mList; 
+0

благодарю вас за помощь ... это сработало хорошо ... я запомню это навсегда ... – sam

+0

Добро пожаловать! – Alireza

+1

Это не асинхронно, поскольку версия для плаката была (пытается быть). –

1

Как об этом один:

public async Task<List<string>> country_set() 
{ 
    mCountryUrl = new Uri ("http://xxxxxxx.wwww/restservice/country"); 
    mList = new List<string>(); 
    mCountry = new List<Country>(); 
    WebClient client = new WebClient(); 
    byte[] data = await client.DownloadDataTaskAsync(mCountryUrl); 
    string json = Encoding.UTF8.GetString(data); 
    mCountry = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Country>> (json); 
    Console.WriteLine (mCountry.Count.ToString()); 
    int x = mCountry.Count; 
    for(int i=0; i<x; i++)   
     mList.Add(mCountry[i].name);   

    return mList; 
} 

Он использует новую модель асинхронной от .Net.

EDIT: Код вводится в приложении для Android. Любой, кто видит синтаксические ошибки (или любой другой вид), прошу их сообщить в комментарии.

+0

спасибо за ваш ответ ... он также работает .... – sam

Смежные вопросы