Windows Phone 开发学习笔记(九) RSS阅读器之获取数据
来源:互联网 发布:扫描字的软件 编辑:程序博客网 时间:2024/06/05 03:18
Hello WindowsPhone的背后虽然有很多内容,但是展示出来的效果毕竟简单,因此想通过实现一个简单的RSS阅读器来熟悉更多应用层面的开发。其实在MSDN上有一个RSS阅读器的例子(http://msdn.microsoft.com/zh-cn/library/hh487167(v=vs.92)),不过说明比较少。这里从头开始实现一个RSS阅读器。常理推断,RSS阅读器的工作流程很简单,如图1所示:
图1 RSS阅读器工作流程
那么首先需要找到一个RSS源获取数据。虽然可以随意选择,但不同源在解析上会有些差别。简单起见,选择新浪的新闻要闻频道(http://rss.sina.com.cn/news/marquee/ddt.xml),它是个纯文字信息的新闻源,不用考虑太多解析显示上的处理。
接下来的任务是通过网络获取源页面的内容。WindowsPhone提供HttpWebRequest 和 WebClient 两个类来实现HTTP请求,这里选择HttpWebRequest,其他相关信息可查询MSDN。
这一步主要是HTTP请求的实现,所以可基于Hello Windows Phone应用,只更改ShowMessage_Click函数的内容,将得到的XML页面源代码直接显示在TextBlock中,检查获得数据是否正确。
直接编辑MainPage.xaml.cs文件,使用以下命名空间:
using System;using System.Windows;using System.Windows.Controls;using Microsoft.Phone.Controls;using System.Net;using System.IO;
发起请求之前,需要创建一个类存储HTTP请求状态,代码如下:
public class FeedUpdateState { publicHttpWebRequest AsyncRequest { get; set; } publicHttpWebResponse AsyncResponse { get; set; } }
之后,在ShowMessage_Click函数中添加以下代码:
// URI UriBuilderfullUri = new UriBuilder("http://rss.sina.com.cn/news/marquee/ddt.xml"); // 初始化WebRequest HttpWebRequestfeedRequest = (HttpWebRequest)WebRequest.Create(fullUri.Uri); // 设置异步请求状态对象 FeedUpdateStatefeedState = new FeedUpdateState(); feedState.AsyncRequest =feedRequest; // 开始异步请求 feedRequest.BeginGetResponse(new AsyncCallback(HandleFeedResponse),feedState);
发起异步请求时,指定回调函数为HandleFeedResponse,其代码如下:
private voidHandleFeedResponse(IAsyncResult asyncResult) { if(asyncResult.AsyncState != null) { // 获得异步请求的状态信息 FeedUpdateStatefeedState = (FeedUpdateState)asyncResult.AsyncState; HttpWebRequestfeedRequest = (HttpWebRequest)feedState.AsyncRequest; // 结束异步请求 try { feedState.AsyncResponse = (HttpWebResponse)feedRequest.EndGetResponse(asyncResult); } catch { Deployment.Current.Dispatcher.BeginInvoke(new Action(()=> { MessageBox.Show("网络错误", "提示", MessageBoxButton.OK); })); return; } StreamstreamResult; try { //从状态对象中获取返回的数据流 streamResult =feedState.AsyncResponse.GetResponseStream(); if(streamResult != null) { // 从状态对象中获取返回的数据流并显示在TextBlock中 StreamReader reader = new StreamReader(streamResult); Deployment.Current.Dispatcher.BeginInvoke(new Action(()=> { HelloText.Text =reader.ReadToEnd(); })); } else { Deployment.Current.Dispatcher.BeginInvoke(new Action(()=> { MessageBox.Show("获取数据为空", "提示", MessageBoxButton.OK); })); } } catch(FormatException) { Deployment.Current.Dispatcher.BeginInvoke(new Action(()=> { MessageBox.Show("对不起,获取数据失败", "提示", MessageBoxButton.OK); })); return; } } }}
实现起来很简单,只说明下Deployment.Current.Dispatcher.BeginInvoke的功能。由于HttpWebRequest异步调用完成时不能保证回调函数运行在 UI 线程,而更新TextBlock里的文本需在UI线程处理。Dispatcher类的BeginInvoke方法就是用来实现对 UI 线程的调用。
修改完成后,点击HellpWP按钮之后,上方TextBlock内会显示XML页面的源代码,不过显示效果太差,需要更改下TextBlock的属性。切换到MainPage.xaml页面,选中TextBlock,在其“Text”属性中,调整文本字号为12,“TextWrapping”属性为Wrap。现在做的是RSS阅读器,所以更改按钮“HelloWP”为“WP_RSS”,并删除页面中MessagePanel的RowDefinitions代码。调试运行,如果网络连接正常,最终效果如图2所示:
图2实际运行效果图
- Windows Phone 开发学习笔记(九) RSS阅读器之获取数据
- Windows Phone 开发学习笔记(十) RSS阅读器之解析数据
- Windows Phone 开发学习笔记(十一) RSS阅读器之显示数据
- windows phone 开发Rss阅读器教程
- Windows Phone开发学习之九——图像控件
- Windows Phone 开发学习笔记(二) Hello Windows Phone之不费功夫
- Windows Phone 开发学习笔记(三)Hello Windows Phone之深藏不露
- Windows Phone 开发学习笔记(四) Hello Windows Phone之心有灵犀
- Windows Phone 开发学习笔记(五) Hello Windows Phone之虎头蛇尾
- Windows Phone 开发学习笔记(六) Hello Windows Phone之生死有命
- Windows Phone 开发学习笔记(七) Hello Windows Phone之有始有终
- Windows Phone 开发学习笔记(八) Hello Windows Phone之本性难移
- Windows Phone 开发学习笔记(一) 开发环境搭建
- Windows Phone开发之获取摄像头
- Android开发RSS阅读器
- 学习笔记:windows phone 学习之 style(样式)
- Windows Phone开发之Json数据解析
- windows phone 8 开发学习笔记(一)
- HTTPCookie 的使用和讲解
- JVM内存溢出分析
- ZOJ Monthly, July 2012浙大月赛解题报告
- Android动态加载jar/dex
- Floyd: Arbitrage
- Windows Phone 开发学习笔记(九) RSS阅读器之获取数据
- android的测试工具CTS
- C语言插件机制(上)
- isight5 二次开发之 Application (2) 之 Calc组件
- 面试体会
- <cf> Prizes, Prizes, more Prizes
- C语言插件机制(下)
- 对于排序 学习心得
- C#的interface关键字