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所示:     

RSS阅读器工作流程

图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实际运行效果图