我一直在将一个现有的 J2ME 移动应用程序移植到最新的诺基亚 SDK 2.0平台,该应用程序允许用户查看存档的新闻视频,适用于 40 系列全触控设备。
我将LWUIT和LWUIT4IO技术分别用于应用程序的 UI 和网络功能。
该应用程序已经过测试,可在S40 第 5 版 SDK平台模拟器上运行。扩展 LWUIT4IO 的 ConnectionRequest 类并利用 LWUIT 的 XMLParser,应用程序可以成功发送 HTTP 请求并从 Web 服务获取预期的响应数据,该服务基本上返回 XML 格式的提要类型(包含视频的必要元数据)(这里是网络服务: http ://nokiamusic.myxph.com/nokianewsfeed.aspx?format=3gp )
但由于某种原因,当尝试在最新的诺基亚 SDK 2.0 平台上运行应用程序时,情况并非如此。 在尝试解析 (XMLParser.parse()) Web 服务的 InputStream 响应时,它会抛出 java.lang.NullPointerException 。当我跟踪发送的相应请求和接收的响应的模拟器的网络流量监视器时 - 尽管响应状态为 200 成功,但仍返回 0 个字节作为内容。显然 XMLParser 对象首先没有要解析的内容。
我希望你能以某种方式阐明这个问题或分享任何相关的解决方案,或者帮助我进一步完善这个问题。
下面贴出的是SegmentService类(LWUIT 的 ConnectionRequest 的子类)的代码,它连接到 Web 服务并处理 XML 响应:
public class SegmentService extends ConnectionRequest implements ParserCallback {
private Vector segments;
private Video segment;
public SegmentService(String backend) {
String slash = backend.endsWith("/") ? "" : "/";
setPost(false);
setUrl(backend + slash + "nokianewsfeed.aspx");
addArgument("format", "3gp");
}
public void setDateFilter(String date) {
System.out.println(date);
addArgument("date", date);
}
private Video getCurrent() {
if (segment == null) {
segment = new Video();
}
return segment;
}
protected void readResponse(InputStream input) throws IOException {
InputStreamReader i = new InputStreamReader(input, "UTF-8");
XMLParser xmlparser = new XMLParser();
System.out.println("Parsing the xml...");
Element element = xmlparser.parse(i);
System.out.println("Root " + element.getTagName());
int max = element.getNumChildren();
System.out.println("Number of children: " + max);
segments = new Vector();
for (int c = 0; c < max; c++) {
Element e = element.getChildAt(c);
System.out.println("segment " + c);
int len = e.getNumChildren();
System.out.println("Number of children: " + len);
for (int d=0; d<len; d++) {
Element s = e.getChildAt(d);
String property = s.getTagName();
System.out.println("key: " + property);
String value = (s.getNumChildren()>0) ? s.getChildAt(0).getText() : null;
System.out.println("value: " + value);
if (property.equals("title")) {
getCurrent().setTitle(value);
} else if (property.equals("description")) {
getCurrent().setDescription(value);
} else if (property.equals("videourl")) {
getCurrent().setVideoUrl(value);
} else if (property.equals("thumburl")) {
getCurrent().setThumbUrl(value);
} else if (property.equals("adurl")) {
getCurrent().setAdUrl(value);
} else if (property.equals("publishdate")) {
getCurrent().setPublishDate(value);
} else if (property.equals("category")) {
getCurrent().setCategory(value);
} else if (property.equals("weburl")) {
getCurrent().setWebUrl(value);
} else if (property.equals("thumburl2")) {
getCurrent().setThumb210(value);
} else if (property.equals("thumburl4")) {
getCurrent().setThumb40(value);
}
}
if (segment != null) {
segments.addElement(segment);
segment = null;
}
}
fireResponseListener(new NetworkEvent(this, segments));
}
public boolean parsingError(int errorId, String tag, String attribute, String value, String description) {
System.out.println(errorId);
System.out.println(tag);
System.out.println(value);
System.out.println(description);
return true;
}
}