<fieldset>
标记内的所有内容都位于圆角矩形内,textRow <div>
用于分隔行。带有 <h2>
标记的标题显示为列表上方的组标签。图 10 显示了最终页面。
图 10. java.math.BigDecimal 中的构造函数的详细视图
拥有三个导航级别和目标详细信息页面后,UI 就完成了。iDoc 使用户可以专注于具体任务。借助 iUi 框架和一些定制的 CSS,它看上去很像本机 iPhone 应用程序。
开发 iDoc
现在已经设计了 UI,接下来需要编写代码来生成 HTML 文件。创建一个插入到 Sun 的 javadoc
命令中的简单 doclet。我们的示例将使用标准 java.* 包,但是 iDoc 可以从任何源代码生成 Javadoc。使用 OpenJDK 源代码,因为它可以公开获得并且 GNU Public License (GPL) V2 许可证允许我们生成和发布其 Javadoc。
使用 iDoc,只需迭代包和类并调用方法打印上述格式的静态 HTML 页面。清单 4 显示打印目标详细信息页面的方法。
清单 4. 输出详细信息页面的 Doclet 代码
private void printDetail(PrintStream p, ProgramElementDoc doc, String id, String name) { divHeader(p, id, name, "panel"); textHeader(p, null); textRow(p, getSignature(doc)); textRow(p, getCommentText(doc.commentText())); textFooter(p); if (doc instanceof ExecutableMemberDoc) { printMethodDetail(p, (ExecutableMemberDoc) doc); } divFooter(p); } private void printMethodDetail(PrintStream p, ExecutableMemberDoc field) { if (field.parameters().length > 0) { textHeader(p, "Parameters"); for (int i=0; i<field.paramTags().length; i++) { textRow(p, "<b>" + field.parameters()[i].typeName() + " " + field.paramTags()[i].parameterName() + "</b>: " + getCommentText(field.paramTags()[i].parameterComment())); } textFooter(p); } if (field.throwsTags().length > 0) { textHeader(p, "Throws"); for (int i=0; i<field.throwsTags().length; i++) { textRow(p, "<b>" + field.throwsTags()[i].exceptionName() + "</b>: " + getCommentText(field.throwsTags()[i].exceptionComment())); } textFooter(p); } }
代码是通用的,这样 printDetail()
将处理类描述、字段、构造函数和方法的输出。后两种类型是 ExecutableMemberDoc
的子类,因此打印关于其参数和已抛出异常的附加信息。
Aptana 的 iPhone Preview 模式将帮助调试输出文件。在每次迭代后,您可以快速单击该应用程序查找已设计界面中的不一致性。但是,使用 Preview 模式可以掩盖性能问题:现代计算机的运行速度比 iPhone 的 620-MHz ARM 处理器快三至五倍。此外,用户经常通过速度慢的蜂窝网络下载页面,因此必须用实际 iPhone 运行您的应用程序。
性能问题
当我在 iPhone 中测试查看 iDoc 时,我发现输出一个大型 HTML 文件将导致跳帧和性能下降。要解决此问题,创建一个用于导航包名/类名的主文件,然后为带有注释和方法细节的每个类创建独立文件(参见清单 5)。虽然此过程将生成大量文件,但是各个文件大小都非常小,并且应用程序运行得十分流畅。
清单 5. Doclet 代码将迭代每个包,然后为每个类创建文件
out = new FileOutputStream(index); p = new PrintStream(out); printHeader(p); PackageDoc[] packages = root.specifiedPackages(); Arrays.sort(packages); printPackages(p, packages); for (int i=0; i<packages.length; i++) { printPackageDetail(p, packages[i]); } for (int i=0; i<packages.length; i++) { ClassDoc[] classes = packages[i].allClasses(); Arrays.sort(classes); for (int j=0; j<classes.length; j++) { // Creating a separate file for each class. PrintStream p2 = new PrintStream(new FileOutputStream(getFilename(classes[j]))); priNTClassDetail(p2, classes[j]); p2.close(); } } printFooter(p); p.close();
运行 iDoc
在经过该性能增强之后,就能运行 iDoc 了。为 OpenJDK 中的 51 个 java.* 和 javax.* 包(表示 1,304 个类)生成 Javadoc,然后把所有内容上传到 Web 服务器中。这包括超过 16 MB 的文件,但是主要导航页面只有 112 KB,并且每个单独类的详细信息页面平均为 13 KB。即使在使用 EDGE 网络时,应用程序也能够快速响应。如果您已经拥有了 iPhone,请访问 iDoc 站点(请参阅 参考资料 )并尝试使用,也可以下载 iDoc 来为您自己的代码库生成特定于 iPhone 的 Javadoc。图 11 显示了最终的应用程序。
图 11. 用于 iPhone 的全部 51 个包的 Javadoc
可能对 iDoc 进行的扩展包括支持显示 Java 5 泛型,以及更智能地捕捉 Javadoc 注释内的标记来实现页面之间的链接。如果您有兴趣添加 iDoc 的功能,则可以下载完整的源代码.
iPhone 开发的前景
2007 年 10 月,Steve JOBS 宣称 Apple 将于 2008 年 2 月发布 iPhone SDK。详细信息很少,因为这是在 2007 年 12 月编写的,但是 SDK 将允许您在不需要使用 Safari 的情况下创建能够在 iPhone 上本机运行的应用程序。给定 iPhone 底层架构之后,开发平台很可能是类似于 Mac OS X 的 Cocoa 和 Objective-C。Apple 主管人员的最新评论暗示第三方应用程序将需要接受某种类型的认证过程。
通过在本机运行,需要高级动画、图形和网络访问的应用程序将从中获益。不过,即使在发布了 SDK 之后,iPhone 的 Web 开发仍会是一个吸引人的主题。Web 应用程序很容易创建和部署。诸如 Aptana 和 iUi 之类的工具简化了开发,并且能够快速创建 Web 应用程序。正如 iDoc 所展示的,没有必要等待 SDK 的发布:使用现有的工具,您可以创建具有本机界面外观的全功能 iPhone Web 应用程序。