原文:Learn about JavaFX's APIs for Reading RSS and Atom Newsfeeds
作者:Jeff Friesen
出处:http://today.java.net/article/2009/11/30/learn-about-javafxs-apis-reading-rss-and-atom-newsfeeds
JavaFX 1.2引入了许多有意思的API,其中包括了用于读取RSS和Atom新闻推送(newfeed)的API。如果你还未曾使用过这些API来的话,你将会发现它们大大地简化了把新闻推送阅读器整合到JavaFX应用中这一任务。
本文向你介绍了RSS和Atom的API,首先研究它们的共同基础,然后浏览每个API的关键类,最后,通过探讨FeedTask类对新闻推送轮询的实现来深入了解这些API是如何工作的。
共同的基础
RSS和Atom的API分别是以抽象类javafx.async.Task为根源的共同基础框架上的两个分支,该类使得启动、停止和跟踪运行在后台线程中的活动(任务)成为可能。
Task提供onStart和onDone变量来标识在任务启动和终止时被调用的函数,其他的变量则报告任务的进展情况和处置情况(成功或者失败),该类还提供了抽象的start():Void和stop():Void函数来启动和终止任务的执行。
抽象类javafx.data.feed.FeedTask扩展了Task,除了继承Task的变量之外,还重写了它的start()和stop()函数,FeedTask提供了以下的函数和变量:
poll(): Void:轮询新闻订阅的location以获得更新的内容,提取和解析内容,然后交付给应用。
update(): Void:轮询新闻订阅的location,提取和解析所有内容,然后交付给应用。
headers(类型为javafx.io.http.HttpHeader[])标识了一系列每次轮询新闻推送时发送给location的HTTP请求标头,该变量默认为null。
interval(类型为javafx.lang.Duration)指定了在再一次轮询新闻推送获得更新之前必须要间隔的时间长度,需要为该变量指明一个正数值,缺省值为0.0。(我不知道如果选择一个诸如60秒之类的正值作为轮询的默认值是不是会更好一些,也许可以用0.0来表明不需要轮询)
location(类型为String)指定了新闻推送的地址,该变量的缺省值为空串(””)。
onException(类型为function(:Exception):Void)标识了当前轮询期间发生异常时被调用的函数,该变量的缺省值为null。
onForeignEvent(类型为function(:javafx.data.pull.Event):Void)标识了被调用来处理扩展元素的函数,这些新闻推送元素的命名空间URI不是Atom或者RSS,例如,某个给定的Atom新闻推送的推送元素的开始标记是这样指定的<feed xmlns="http://www.w3.org/2005/Atom" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">,解析随后的<opensearch:totalResults>1911</opensearch:totalResults>元素得出三个陌生的项目(对应开始标记、文本内容和终止标记),因为totalResults的命名空间是http://a9.com/-/spec/opensearch/1.1/(以opensearch:前缀的方式指定)而不是http://www.w3.org/2005/Atom。该变量的缺省值为null。
共同基础框架也根植于抽象类javafx.data.feed.Base之上,这是描述了各种新闻推送元素的RSS和Atom类的基类,RSS的RSS和Atom的Feed这些顶层元素类是Base子类的例子。
Base提供了一个namespaces变量(类型为javafx.data.Pair[]),该变量包含了对元素有效的命名空间的定义,每个Pair的名称部分指明了命名空间前缀,值部分指定了命名空间URI。
Base还提供了一个parent变量(类型为Base),该变量用来表示父(把其包含之内的)元素,例如,Atom的Entry元素类的parent变量指向包含它的Feed实例,如果没有父元素(像Feed这种情况)的话,则该变量的值为null。
最后要说的是,Base提供了几个函数,在需要创建自定义的推送解析器的时候,它们会派上用场,因为这项工作超出了本文的范围,你可以参考Rakesh Menon的这篇博客文章Custom Feed Parsers以了解更多的内容和例子。