2016-08-17 3 views
1

Если я хочу добавить элемент в TableView, тогда цикл должен быть остановлен. Но у меня есть WebResponse, и каждый HTTP Chunked TableView нуждается в новом элементе.Xamarin IOS TableView не обновляется в цикле While

У кого-нибудь есть решение добавить элемент в TableView без остановки цикла while?

это моя тема

new System.Threading.Thread(new System.Threading.ThreadStart(() => 
    { 
     InvokeOnMainThread(() => 
     { 
      HttpRequest t = new HttpRequest(TableView, source); 
      t.Start(); 
     }); 
    })).Start(); 

И это мой цикл:

WebResponse webResponse = web.GetResponse(); 
     Stream stream = webResponse.GetResponseStream(); 

     var reader = new XmlTextReader(stream); 
     string telegram = ""; 
     int check = 0; 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        break; 
       case XmlNodeType.Text: 
        break; 
       case XmlNodeType.EndElement: 
        break; 
      } 
     } 

и в Funtion в цикле я делаю это

 (tableView.Source as TelegrammSource).AddTelegramm(details); 
     tableView.ReloadData(); 
+0

, что вы имеете в виду петли должны быть остановлены, вы можете объяснить больше. –

+0

Пожалуйста, покажите нам свой код. Скорее всего, если ваш цикл работает в фоновом потоке, и вам нужно обновить свой пользовательский интерфейс из основного потока. – Jason

+0

У меня есть редактирование моего вопроса. – Doxoh

ответ

0

Там образец, чтобы закончить асинхронные данные, запрашивающие и обновляющие ваш вид таблицы:

string strURL = "https://api.bitcoinaverage.com/ticker/"; 
    MyHTTPRequestManager.Instance.GetDataFromUrl (strURL,(string dataStr)=>{ 
     Console.WriteLine("Getting data succeed"); 
     Console.WriteLine("The dataStr = "+dataStr); 
     //update your dataList here 
     InvokeOnMainThread(delegate { 
      //Update your tableView or collectionView here, all UI stuff must be invoke on Main thread 
     }); 
    }); 

И это MyHTTPRequestManager.cs:

public class MyHTTPRequestManager 
{ 
public delegate void GettingDataCallback(string dataStr); 

private static MyHTTPRequestManager instance = null; 
public static MyHTTPRequestManager Instance{ 
    get{ 
     if(null == instance) 
      instance = new MyHTTPRequestManager(); 
     return instance; 
    } 
} 

public void GetDataFromUrl(string strURL,GettingDataCallback callback) 
{ 
    Console.WriteLine ("Begin request data."); 
    System.Net.HttpWebRequest request; 
    request = (System.Net.HttpWebRequest)WebRequest.Create(strURL); 
    System.Net.HttpWebResponse response; 
    response = (System.Net.HttpWebResponse)request.GetResponse(); 
    System.IO.StreamReader myreader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8); 
    string responseText = myreader.ReadToEnd(); 
    myreader.Close(); 
    Console.WriteLine ("Getting succeed, invoke callback."); 
    callback.Invoke (responseText); 
} 
} 

Надеется, что это может помочь вам.

+0

спасибо за ваш ответ. Да, это может помочь, но я не использую функцию ReadToEnd(). Я работаю с HTTP Chunkes. Именно по этой причине соединение будет открываться каждый раз. – Doxoh

+0

Я постараюсь завтра, когда я дома и дам вам отзыв – Doxoh

+0

Так что я попробовал, но он не работает ... – Doxoh

0

Это мой ViewDidLoad на TableviewController

base.ViewDidLoad(); 
     Console.Out.WriteLine("ViewDidLoad"); 
     TableView.SeparatorColor = UIColor.Black; 
     TableView.SeparatorStyle = UITableViewCellSeparatorStyle.SingleLine; 
     source = new TelegrammSource(); 
     TableView.Source = source; 
     new System.Threading.Thread(new System.Threading.ThreadStart(() => 
     { 
      InvokeOnMainThread(() => 
      { 
       HttpRequest t = new HttpRequest(TableView, source); 
       t.Start(); 
      }); 
     })).Start(); 

И это мой HttpRequest

public class HttpRequest 
{ 
    //private volatile bool _shouldStop; 
    public string url = ""; 
    private HttpWebRequest web = null; 
    readonly UITableView tableView; 

    public HttpRequest(UITableView tableView, TelegrammSource source) 
    { 
     this.tableView = tableView; 


     url = "http://www.example.com"; 
     web = (HttpWebRequest)WebRequest.Create(url); 
     web.Credentials = new NetworkCredential((kanalsettings[(NSString)GlobaleVariablen.KE_BENUTZERNAME] as NSString), (kanalsettings[(NSString)GlobaleVariablen.KE_PASSWORT] as NSString)); 
    } 

    public void Start() 
    { 
     WebResponse webResponse = web.GetResponse(); 
     Stream stream = webResponse.GetResponseStream(); 

     var reader = new XmlTextReader(stream); 
     string telegram = ""; 
     int check = 0; 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        break; 
       case XmlNodeType.Text: 
        break; 
       case XmlNodeType.EndElement: 
         Process(telegram); 
        break; 
      } 
     } 
    } 

    public void Process(string result) 
    { 
     var details = new TelegrammDetails(); 
     var xml = new XmlDocument(); 
     xml.LoadXml(result); 
     XmlNodeList telegram = xml.SelectNodes("/"); 
     foreach (XmlNode item in telegram) 
     { 

     } 
     (tableView.Source as TelegrammSource).AddTelegramm(details); 
     tableView.ReloadData(); 

    } 

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