[译文]了解用于读取RSS和Atom新闻推送的JavaFX API(三)
FeedTask背后的秘密
轮询RSS或者Atom新闻推送的重要任务发生在FeedTask及一个相关类中,我最近反编译了这些类以研究新闻推送是如何被轮询的,本节中我分享我的这些发现,以加深你对RssTask和AtomTask的理解。
FeedTask在它的静态初始化程序中创建了类java.util.Timer的一个实例,该实例启动了一个后台线程,并与FeedTask的嵌套类SubscriptionTask(java.util.TimerTask的子类)的一个实例一起工作以支持新闻推送轮询。
FeedTask重写了start()函数,通过使用下面的参数调用Timer的public void schedule(TimerTask task, long delay, long period)方法来安排SubscriptionTask实例的执行:
把SubscriptionTask实例传递给task。
把长整型的值0L传递给delay.
把FeedTask的interval变量的值传递给period。
大约每经过period指定的毫秒数,SubscriptionTask实例的public void run()方法就被调用一次,该方法使用true参数调用了SubscriptionTask专有的doPoll()方法。
doPoll()方法先清除FeedTask所继承的started、stopped、failed和done等布尔类型的变量,把他们的值设为false,还把继承的causeOfFailure变量的值设为null,以及把继承的progress和maxProgress变量的值设为-1。
doPoll()接下来实例化javafx.io.http.HttpRequest,该类是被用来获取新闻推送内容的一个载体,接着初始化下面的HttpRequest变量,这样才能执行这一任务。
location:FeedTask的location变量的值被赋给这一变量。
onStarted:某个函数被指派给该变量,当请求开始执行时该函数被调用。该函数负责调用onStart()。
onResponseHeaders:某个函数被指派给该变量,用以检索和保存HTTP ETag和Last-Modified响应标头的值。
onToRead:某个函数被指派给该变量,以获取需要读取的总字节数,该值被赋给maxProgress变量。
onRead:某个函数被指派给该变量,以获取到目前为止已读取的字节数,该值被赋给progress变量。
onInput:某个函数被指派给该变量,该函数通过调用内部的parse(is)方法(is是onInput()的java.io.InputStream类型的参数)来解析请求内容,如果解析过程导致了异常的抛出的话,那么异常对象被指派给causeOfFaillure变量,true值被指派给failed变量,然后调用onException()。最后,true值被赋给done变量,接着调用onDone()。(在只请求变更的内容而内容又不可获得时,onInput()函数没有被调用,因此onDone()没有被调用。)
onException:某个函数被指派给该变量,以报告请求本身(而不是解析过程)的问题,如果请求失败了的话,异常对象被指派给causeOfFailure,true值被赋给failed变量,接着调用onException()。
接下来,doPoll()通过把请求的If-Modified-Since和If-None-Match标头的值分别设置成为之前保存的Last-Modified和ETag的值来确保只返回更新的新闻推送内容。
获取新闻推送的更新或者全部内容
|
当把true值传递给doPoll(),从SubscriptionTask的run()方法或者从FeedTask的poll()函数中调用该方法时,哪些情况会发生呢?,doPoll()设置了If-Modified-Since和If-None-Match,因此只返回更新内容,相反,在调用FeedTask的update()函数的时候,该函数使用false值作为参数调用doPoll(),那些请求标头没有被设置,因此会返回所有的内容。
|
doPoll()现在遍历FeedTask的headers变量,通过调用HttpRequest实例的setHeader()函数把存储的每个HttpHeader实例都赋给HttpRequest实例。
最后,doPoll()调用HttpRequest实例的start()函数来执行这一任务,检索并得到了解析后的内容,然后从doPoll()返回到run()方法中,如果doPoll()抛出异常的话,则run()调用onException()。
关于解析的一点资料
|
为简洁起见,我不讨论超出parse(is)方法调用范围的解析,不过,如果你决定研究解析的实现的话,那么这里的一点资料可帮你免去那些令人挠头的困惑:parse(InputStream)方法把javafx.data.pull.PullParser实例的impl_skippedElements变量的值初始化成Atom的summary、comtent、rights、title、subtitle元素及RSS的description、title、copyright元素的限定名(qualified name),以确保解析器把内嵌在这些元素中的任何HTML或者其他标记当成文字文本对待。
|
在某些时候,你可能会调用FeedTask重写的stop()函数,该函数调用Subscription实例继承的public boolean cancel()方法来取消新闻推送轮询任务(但不会杀掉Timer实例的后台线程)。
结束语
理论足够多了!现在你已经获知了关于JavaFX的RSS和Atom API的知识,你可能想创建自己的新闻推送阅读器,为了帮助你完成这一任务,我在即将发表的本文的后续篇中展示了一个处理RSS和Atom新闻推送到例子。
资源
本文的示例代码
Atom规范
JavaFX 1.2.1 API文档
JavaFX官方网站
Rakesh Menon的Custom Feed Parsers博客帖子
RSS规范
维基百科的Atom(standard)条目
维基百科的RSS条目
Jeff Friesen是一个专门从事Java技术的自由软件开发者和教育工作者,可访问他的网站javajeff.mb.ca。
分享到:
相关推荐
JavaFX API文档。Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich ...
JavaFX api文档 chm格式
JavaFX API Documentation
JAVA 8 官网API ,JavaFX 2.0 API官网 整合 生成CHM文件。
用于JavaFX学习的帮助文档JavaFX api,
JavaFX 包含了一些列图形和媒体包,允许程序员设计、创建、测试、调试、和部署富客户端应用并且保持跨平台的操作一致性。 JavaFX 应用程序由 Java API 编写,可以调用任何 Java API 包。例如,可以调用 Java API ...
javafx8api文档
JavaFx api帮助文档
javafx2.2 API文档 英文文档 希望对你有所帮助
javafx的最新发布版本的最新API文档,包含目前新增所有包的信息!希望支持java!
javafx 2.2的 api,chm版本的,英文版的
JavaFX2 API chm文件
Javafx 2.0 正式版本的api手册,方便使用。
进行javafx开发时使用的api工具书。方便随时查询。
javaFxAPI(PDF版)根据官方资料制作
javafx-8_0_0-apidocs,该文档下载自官网,经本人制作而成方便使用的chm格式,我的更多下载资源:http://download.csdn.net/user/xubingtao。
最新JavaFX 2.2官方原版API documentation,解压缩后直接可以使用
javafx2.0的官方文档制作而成,包含索引
javafx api 帮助文档chm格式英文版 挑战英语迟早也得过这关