使用webrequest和uialertview在MonoTouch中进行线程化

时间:2012-09-27 15:06:16

标签: iphone ios multithreading xamarin.ios monodevelop

我使用HttpWebRequest访问网站并检索一些数据,并且在检索所述数据时我需要UIAlertView并显示UIActivityIndicatorView。但是,它只是使屏幕变暗,并且在为时已晚之前不会显示警报。我在这里阅读了其他与线程相关的问题,但无法弄清楚如何解决这个问题。我尝试使用ThreadPool,InvokeOnMainThread,Tasks,所有这些都没有用。

编辑:

HttpWebRequest url = (HttpWebRequest)WebRequest.Create ("maps.googleapis.com/maps/api/place/search/..); 

HttpWebResponse webResp = (HttpWebResponse)url.GetResponse (); JsonValue jVal = 

JsonObject.Load (webResp.GetResponseStream ()); 

JsonObject jObj = (JsonObject)jVal; 

我有上面的代码,如果它将为我正确格式化,我将如何转换为使用WebClient?你还能从中获得JSON等吗?

1 个答案:

答案 0 :(得分:2)

使用WebClient和其中一种*Async方法比使用HttpWebRequest更容易(并且不易出错)。

以下是下载并显示小图片的示例。

WebClient client = new WebClient ();
var wait = new UIActivityIndicatorView (View.Bounds);
client.DownloadDataCompleted += (object sender, DownloadDataCompletedEventArgs e) => {
    byte[] result = e.Result;
    if (result != null) {
        NSData data = NSData.FromArray (e.Result);
        UIImage img = UIImage.LoadFromData (data);
        InvokeOnMainThread (delegate {
            ShowImage (img);
            wait.StopAnimating ();
        });
    }
};
wait.StartAnimating ();
client.DownloadDataAsync (new Uri (url));

编辑(更新问题)

对于流,您可以使用WebClient.OpenReadAsyncOpenReadCompleted事件。