在这里,我试图从服务器下载文件到SD卡。代码如下所示:
try{
FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml");
if (fconn.exists()) {
fconn.delete();
}
fconn.create();
add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection)
Connector.open("http://127.0.0.1/xml/home.xml");
add(new RichTextField("Connection success", Field.NON_FOCUSABLE));
InputStream ds = connection.openInputStream();
byte[] data = new byte[ds.available()];
ds.read(data);
add(new RichTextField("Data read", Field.NON_FOCUSABLE));
OutputStream outStream = fconn.openOutputStream();
outStream.write(data);
outStream.close();
add(new RichTextField("Data written succesfully", Field.NON_FOCUSABLE));
fconn.close();
}
catch (Exception e) {
// TODO: handle exception
}
问题是在emulatora上我看到前两个消息,即
但之后,没有给出数据被写入的消息。 XML文件的大小为1KB。请帮帮我吗?我的代码有问题还是有其他问题?
首先,这一行:
add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
让我觉得你是直接在事件线程上做这个,这是不好的做法。如果连接超时或需要很长时间,那么您将冻结GUI。你通常会产生一个工作线程来执行这样的长任务。
也就是说,你的代码可以工作,但它并不是很强大。很多事情都会变坏。例如,这一行:
HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");
返回的连接可以为null,因此您必须检查它。您最好使用ConnectionFactory
,因为它为每种连接附加正确的后缀(WiFi,BES,TCP,...)。在模拟器中,我不确定您是否可以使用localhost URL,因为它是您工作站的本地URL,但模拟的BB设备必须通过MDS模拟器。
使用FileConnection
,您还必须检查它是否为空,并且fconn.canRead
也返回true。考虑到并非每个设备都有SD卡插槽(最近的设备都有)。您可以检查卡是否可用,如this article中所述,或让catch
处理异常。如果您在模拟器上进行测试,则必须“安装”虚拟SD卡。
这个电话:
ds.read(data);
将阻止,直到服务器实际发送给你的东西。这可能是正在发生的事情。
您必须检查您是否拥有正确的权限。对于文件连接,您需要:
ApplicationPermissions.PERMISSION_FILE_API
对于网络连接,根据您连接的位置,您需要以下其中一个:
ApplicationPermissions.PERMISSION_INTERNET
ApplicationPermissions.PERMISSION_SERVER_NETWORK
最后一个提示:在try-catch中添加一个finally子句,并关闭finally中的所有流和连接(如果它们不为null)。
仅在失败的InputStream ds = connection.openInputStream();
行上尝试HTTP连接,因此在此之后您不会看到任何消息。失败的原因可能是因为模拟器无法访问指定的URL。
在线Connector.open("http://127.0.0.1/xml/home.xml");
尝试将URL更改为http://127.0.0.1/xml/home.xml?interface=wifi
。
这将迫使模拟器使用模拟的WLAN连接,这实际上是您PC的网络接口。确保模拟器连接到Default WLAN connection
。
此外,不是在屏幕上添加UI字段以查看代码中发生了什么,而是最好添加调试消息(例如System.out.println("Got connection")
)并使用调试器 - 只需在eclipse中按F11即可。