Windows Phone网络应用 (2)

来源:互联网 发布:七牛和阿里云 编辑:程序博客网 时间:2024/05/21 17:37
2 WebClient与HttpWebRequest使用实例
* 首先创建一个Silverlight应用程序DevDivNetworking
* 打开MainPage.xaml,添加3个Image控件
  1. <Image Height="60" HorizontalAlignment="Left" Margin="6,18,0,0" Name="webClientImage" Stretch="Fill" VerticalAlignment="Top" Width="60" />
  2. <Image Height="60" HorizontalAlignment="Left" Margin="9,174,0,0" Name="httpRequestImage" Stretch="Fill" VerticalAlignment="Top" Width="60" />
  3. <Image Height="60" HorizontalAlignment="Left" Margin="12,342,0,0" Name="imagesourceImage" Stretch="Fill" VerticalAlignment="Top" Width="60" Source="http://www.devdiv.com/bbs/forumimage/wp.jpg"/>
复制代码
其中webClientImage用来显示WebClient请求返回的图片,
httpRequestImage用来显示HttpWebRequest返回的图片,
而imagesourceImage图片,我们直接设置它的Source指向一个网络图片地址,不需要我们自己来下载,程序执行的时候自动下载,下载完成以后自动更新Image控件,它直接封装了下载和更新过程,和我们即为webClientImage和httpRequestImage做的事情是一样的。
* 打开MainPage.xaml.cs文件,添加以下代码:
  1. private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
  2. {
  3. // WebClient request
  4. WebClient webClient = new WebClient(); webClient.OpenReadCompleted += OnWebClientOpenReadCompleted;
  5. webClient.OpenReadAsync(new Uri("http://www.devdiv.com/bbs/forumimage/wp.jpg"));

  6. // HttpWebRequest
  7. string url = "http://www.devdiv.com/bbs/forumimage/wp.jpg";
  8. WebRequest request = HttpWebRequest.Create(url);
  9. IAsyncResult result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
  10. }

  11. // WebClient request callback
  12. void OnWebClientOpenReadCompleted(object sender, OpenReadCompletedEventArgs args)
  13. {
  14. if (!args.Cancelled && args.Error == null)
  15. {
  16. BitmapImage bmp = new BitmapImage();
  17. bmp.SetSource(args.Result);
  18. webClientImage.Source = bmp;
  19. }
  20. }

  21. // HttpWebRequest callback
  22. private void ResponseCallback(IAsyncResult result)
  23. {
  24. HttpWebRequest request = (HttpWebRequest)result.AsyncState;
  25. WebResponse response = request.EndGetResponse(result);

  26. Dispatcher.BeginInvoke(() =>
  27. {
  28. BitmapImage bmp2 = new BitmapImage();
  29. bmp2.SetSource(response.GetResponseStream());

  30. httpRequestImage.Source = bmp2;
  31. });
  32. }
复制代码
我们来解释一下代码,
PhoneApplicationPage_Loaded是页面加载后执行的代码,它发起了两个网络请求,一个是WebClient,一个是HttpWebRequest,做的事情都是一样,都是取网络下载一章图片。
OnWebClientOpenReadCompleted是在WebClient请求返程以后执行的回调函数,这里我们设置了webClientImage指向的图片
ResponseCallback是HttpWebRequest请求的回调函数,同样我们这里设置了httpRequestImage的图片。
大家可能已经注意到了,ResponseCallback并没有直接更新Image控件,而是通过了Dispatcher来实现的,这是因为HttpWebRequest的回调函数是在单独线程中执行的,而不是在主线程中执行
原创粉丝点击